我有一个表单,用户可以从下拉列表中选择一个值。根据这个选择,我想要执行一系列查询。例如,如果用户选择“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...
我没有使用动态查询,也没有任何查询需要其他参数。非常感谢任何和所有的帮助。 汤姆
答案 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
,所以语法可能略有偏差。