情况:
我需要查找每个查询的第一个字段。在我创建下面列出的代码并执行后,我收到了以下Debug.Print
:
~sq_rrptStatTabRout
qryBridgeSub
qryCentTabRout
我期待最后两个打印,但我不太清楚为什么第一个打包因为rptStatTabRout
确实存在于数据库中作为报告。
问题:有没有一种简单的方法来解释或摆脱它?
代码:
Private Sub Command47_Click()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim queries As DAO.QueryDefs
Dim query As DAO.QueryDef
Dim queryname As String
Dim fld As DAO.Field
Set db = CurrentDb
Set queries = db.QueryDefs
' loop through each query
For Each query In queries
On Error Resume Next
queryname = query.name
Debug.Print queryname
Set rs = CurrentDb.OpenRecordset("SELECT * FROM " & queryname & "", dbOpenDynaset)
fld = rs.Fields(0).name
MsgBox fld
Next
End Sub
答案 0 :(得分:2)
似乎您要忽略名称以~
开头的已保存查询。使用If
条件忽略它们。
If Not query.Name Like "~*" Then
' find the first field
End If
注意,如果要将评估限制为仅SELECT
个查询,请检查每个查询的.Type
属性。 SELECT
查询的类型为 dbQSelect (0)。如果要处理其他查询类型,请检查Access'帮助系统中的 QueryDef.Type属性主题。
如果您想知道 ~sq_rrptStatTabRout 查询的来源,请查看 rptStatTabRout 报告的记录来源属性。当源是SELECT
语句时,Access会将语句保存为隐藏查询。 ~
前缀可防止它显示在“导航”窗格中。
当您使用SELECT
语句作为组合或列表框的行来源时,会发生同样的事情。
答案 1 :(得分:2)
首先,我非常后悔在注意到您运行每个查询之前运行代码。因为我有50多个查询,因此有趣的时候......
我修改了你的代码以帮助解释发生了什么,代码限制为10次迭代,因为保存的查询似乎首先显示出来并且被推出了我的直接窗口。
Public Function Test()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim queries As DAO.QueryDefs
Dim query As DAO.QueryDef
Dim queryname As String
Dim fld As DAO.Field
Set db = CurrentDb
Set queries = db.QueryDefs
Dim i As Integer
i = 0
' loop through each query
For Each query In queries
On Error Resume Next
If i < 10 Then
Debug.Print query.Name
Debug.Print query.SQL
i = i + 1
End If
Next
End Function
如果你运行它,你可以在rptStatTabRout
报告中看到它找到的实际SQL。这是因为QueryDefs
中的查询多于您在导航窗格中看到的查询。
在您的示例中,请查看报告的RecordSource
,我怀疑您会找到书面查询。它甚至会在RowSource
中找到用于组合框的sql。