基于组合框选择运行各种查询

时间:2015-06-15 15:35:17

标签: vba ms-access drop-down-menu access-vba

我有一个表单,用户可以从下拉列表中选择一个值。根据这个选择,我想要执行一系列查询。例如,如果用户选择“A'”,则执行查询1,2和4。如果用户选择' B',则查询4,2,3和5将按该顺序执行。查询的数量会有所不同,执行顺序也会有所不同。 我有一个查询订阅'包含下拉列表中每个可能值及其执行顺序要执行的所有查询的表。

tbl_subcription:
 RowID: autonumber     
 SubscriptionID: User selected query list identifier
 QrySequence: Query execution order, unique within each SubscriptionID
 QryName: Name of query to be run

样品:

RowID  SubscriptionID  QrySequence  QryName
 1     A               1           qry1
 2     A               2           qry2
 3     A               3           qry4
 4     B               1           qry4
 5     B               2           qry2
 6     B               3           qry3
 7     B               4           qry5

我想要类似的东西:

For each query in QryList (filtered with SubscriptionID, sorted by QrySequence)
    execute query
Next query
...Display results...       

我没有使用动态查询,也没有任何查询需要其他参数。非常感谢任何和所有的帮助。 汤姆

2 个答案:

答案 0 :(得分:2)

创建一个查询,该查询从 SubscriptionID 与下拉列表选择匹配的行中检索 QryName 值...查询类似于:

SELECT QryName
FROM tbl_subcription
WHERE SubscriptionID = [dropdown]
ORDER BY QrySequence;

然后,您可以根据该查询打开DAO.Recordset,浏览记录集行,然后执行每个 QryName

Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim rs As DAO.Recordset
Dim strSelect As String
strSelect = "SELECT QryName FROM tbl_subcription " & _
    "WHERE SubscriptionID = [dropdown] ORDER BY QrySequence;"
Set db = CurrentDb
Set qdf = db.CreateQueryDef(vbNullString, strSelect)
qdf.Parameters("dropdown").Value = Me.YourDropdownName.Value
Set rs = qdf.OpenRecordset(dbOpenSnapshot)
With rs
    Do While Not .EOF
        db.Execute !QryName, dbFailOnError
        .MoveNext
    Loop
    .Close
End With

YourDropdownName 替换为下拉控件的名称(组合框或列表框)。

该代码期望 YourDropdownName 包含在也包含该代码的表单中。如果代码和 YourDropdownName 都不包含在同一表单中,您可以通过Forms集合中的父表单名称引用下拉列表:

Forms!YourFormName!YourDropdownName

答案 1 :(得分:0)

如果您说The number of queries will vary and so will the order in which they are executed。这听起来像接受ParamArray的函数会处理你正在寻找的东西。

这样的事情:

Public Function RunQueries(ParamArray QueriesToRun())

    Dim i          As Long
    Dim lngUBound  As Long


    'If the ParamArray is not empty
    If UBound(QueriesToRun) >= 0 Then
        lngUBound = UBound(QueriesToRun)

        'For each value in ParamArray
        For i = 0 To lngUBound
            `Run Query: QueriesToRun(i)
        Next

    End If
End Function

这是未经测试的代码,但我认为一切都是正确的,应该做你想要的。我曾经只使用过一次ParamArray,所以语法可能略有偏差。