注意:请耐心等待我,因为我对Access相对较新...我所学到的一切都是通过搜索Google来实现的。
所以我创建一个表单,其唯一目的是搜索数据库。在一个用例中,用户可以选择多个选项来过滤搜索,出于隐私原因,我们可以说“蓝色,绿色,红色,棕色”。用户可以选择这些颜色的任何组合,包括全部或全部。在数据库表中,有一个主键(在我们的例子中是一个ItemID)。表中的其他列是上面的颜色(蓝色,绿色,红色,棕色)。由于这些数据的结构(注意:由于多种原因我无法更改它),我必须在VBA中创建此SQL查询,而不是使用Access提供的内容。
以下是我在按下“搜索”按钮时用于创建和运行查询的代码:
Set qdf = Nothing
*Logic to create SQL query... variable to hold query is called sqlStr*
Set qdf = CurrentDb.CreateQueryDef("TemporaryQuery", sqlStr)
DoCmd.OpenQuery qdf.Name
作为大量搜索的结果,除了使用ADO之外,这是我找到的唯一方法,我可以在VBA中创建SQL查询,然后在VBA中运行它。此方法的缺点是,它可以创建一个查询,必须先关闭并删除该查询,然后才能再次运行查询。对于将使用此功能的用户,这是不可接受的。
我找到的所有例子(请耐心等待)都使用我无法上班的ADO。我有两个数据库,一个用于查询和表单,另一个用于数据本身。包含数据的数据库具有与查询和表单链接到数据库的表。我不确定ADO是否可以在该设置中工作,但如果可以的话,我无法弄明白。
使用Access来自Java / Webdev背景对我来说有点令人沮丧,因为它似乎让事情变得更复杂(在我看来)应该是这样。任何人都可以帮助我正常工作吗?
感谢您的时间......非常感谢!
答案 0 :(得分:4)
我对这些陈述感到困惑......
“此方法的缺点是,虽然它有效,但它创建了一个查询,必须先关闭并删除查询才能再次运行查询。这对于将要使用的用户来说是不可接受的。此“。
我不明白为什么这是用户关注的问题。他们不应该手动删除查询---您可以使用DoCmd.DeleteObject
通过VBA为他们执行此操作。实际上,听起来您可能只需要修改查询。如果是这样,您不需要先删除旧版本,然后创建新查询。您只需更改查询的.SQL
属性即可。
如果用户的问题是他们甚至不想在导航面板中看到 TemporaryQuery (太杂乱?),请将其名称更改为 USysTemporaryQuery 。这样他们只有在将面板属性设置为显示系统对象时才会看到它。
我会提供一些代码示例,但仍然可能不是您想要的。但也许其他人会觉得它很有用。
Const cstrQueryName As String = "TemporaryQuery"
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim sqlStr As String
'*Logic to create SQL query... variable to hold query is called sqlStr*
' Apparently you have that piece worked out. I'll use a simple query ...
sqlStr = "SELECT * FROM Dual;"
Set db = CurrentDb
If Not QueryExists(cstrQueryName) Then
Set qdf = db.CreateQueryDef(cstrQueryName)
Else
Set qdf = db.QueryDefs(cstrQueryName)
End If
qdf.sql = sqlStr
Set qdf = Nothing
Set db = Nothing
DoCmd.OpenQuery cstrQueryName
如果您仍想稍后丢弃已保存的查询,请执行以下操作...
If QueryExists(cstrQueryName) Then
DoCmd.DeleteObject acQuery, cstrQueryName
End If
这是上述代码的辅助函数......
Public Function QueryExists(ByVal pName As String) As Boolean
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim blnReturn As Boolean
Dim strMsg As String
On Error GoTo ErrorHandler
blnReturn = False ' make it explicit
Set db = CurrentDb
Set qdf = db.QueryDefs(pName)
blnReturn = True
ExitHere:
Set qdf = Nothing
Set db = Nothing
QueryExists = blnReturn
Exit Function
ErrorHandler:
Select Case Err.Number
Case 3265 ' Item not found in this collection.
Case Else
strMsg = "Error " & Err.Number & " (" & Err.Description _
& ") in procedure QueryExists"
MsgBox strMsg
End Select
GoTo ExitHere
End Function