QueryDefs返回~sq_rrptStatTabRout

时间:2015-07-23 15:30:50

标签: vba ms-access access-vba ms-access-2007

情况: 我需要查找每个查询的第一个字段。在我创建下面列出的代码并执行后,我收到了以下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

2 个答案:

答案 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。