如何在不创建临时查询的情况下显示Access查询结果?

4
注意:由于我对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是否可以在此设置中工作,如果可以,我也无法弄清楚。
以Java/Webdev背景为基础,使用Access让我感到有些沮丧,因为它似乎使事情变得更加复杂(依我之见)。有人可以帮助我正确地使其工作吗?
感谢您的时间...非常感谢!

@Zaider,你有没有关于如何使用子表单的好教程? - Mike Rinehart
@MikeRinehart 用户只需要查看这些数据,还是需要编辑功能?如果仅从视图角度来看,您可以在表单上使用简单的“列表框”,您可以将“列表框”的“行源”属性设置为一个SQL字符串。 - Matt Donnan
@MattDonnan 列表框的想法可行,但我需要它显示多列,而不仅仅是单列。 - Mike Rinehart
1
是的,你可以这样做:Me.Subform.SourceObject = "sbfSearchAuthorizations" - Zaider
1
@MikeRinehart 列表框可以显示多列,检查列表框属性中的“列”和“列宽”选项。 - Matt Donnan
显示剩余5条评论
1个回答

6

我对以下陈述感到困惑...

“这种方法的缺点在于它会创建一个查询,必须在再次运行查询之前关闭并删除查询。这对于将使用此查询的用户来说是不可接受的。”

我不明白为什么这是用户关心的问题。他们不应该手动删除查询 --- 您可以使用 VBA 中的 DoCmd.DeleteObject 代替他们进行操作。实际上,听起来您只需要修改查询。如果是这样,您不需要先删除旧版本,然后创建新查询。您只需更改查询的 .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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接