访问 VBA 循环遍历集合,为每个项目制作 SQL 语句
Access VBA looping through collection, Making SQL statement for each item
我正在尝试编写代码来生成关联 ID 的集合(关联是我的集合的名称)。在任何给定时间都有 10 位同事,但集合会根据谁在本月做了什么工作而改变。因此,一旦收集完成,我想遍历它并为每个项目创建一个 SQL 语句。有点像这样:
For Each Item In Associates
qryTopSQL = "SELECT TOP " & QA# & _
" Date, ID, [L#], Deal, RndNum FROM tbl_Data WHERE Date Between #" & _
StartDate & "# And #" & EndDate & "# AND ID = " & Associates() & _
" ORDER BY RndNum"
Next Item
所以我最终得到了很多 SQL 个字符串,但我遇到了问题:
- 我写的
ID = " & Associates() & "
部分正确吗?
- 它将如何命名这些不同的字符串以便我以后可以访问它们?
- 完成这些后,我想对所有 SQL 字符串执行
UNION ALL
查询。我该怎么做?
如果可以请帮忙,不胜感激。我是集合和数组的新手,我不明白我在网上找到的一些东西。
编辑更新:
我试过这个:
j = 1
k = 1
For Each Item In Associates
If j = 1 And k = 1 Then
qryTopString1 = "SELECT * FROM qryTopSQL_" & k
Else
qryTopString2 = " UNION ALL SELECT * FROM qryTopSQL_" & k
End If
j = j + 1
k = k + 1
Next Item
'
Set qryTopUnionqdef = CurrentDb.CreateQueryDef("qryTopSQLUnion", qryTopString1 & qryTopString2)
但结果查询是第一个和最后一个 TopSQL 之间的并集,中间的 none。显然此时的循环是问题所在,但到目前为止我还不知道该怎么做。
在 Access 中,有两种创建查询对象的方法:VBA 查询(在代码中)或存储查询(使用功能区、向导或导航栏)。
本质上,你想两者兼顾。因此,为了将您的 VBA SQL 字符串迁移到实际存储的查询对象中,您必须使用 QueryDefs。下面是如何迭代以动态创建 10 个关联查询和 1 个联合查询。
Dim qryTopqdef As QueryDef, qryTopUnionqdef As QueryDef, findqdf As QueryDef
Dim i as Integer, j as Integer
' DELETE QUERIES IF EXIST
For each findqdf in CurrentDb.Querydefs
If Instr(findqdf.Name, "qryTopSQL") > 0 Then
db.QueryDefs.delete(findqdf.Name)
End if
Next findqdf
' INDIVIDUAL 10 QUERIES
i = 1
For Each Item In Associates
qryTopSQL = "SELECT TOP " & QA# & _
" Date, ID, [L#], Deal, RndNum FROM tbl_Data WHERE Date Between #" & _
StartDate & "# And #" & EndDate & "# AND ID = " & Item & _
" ORDER BY RndNum"
' QUERY NAMES ARE SUFFIXED BY THE ITERATOR COUNT
Set qryTopqdef = CurrentDb.CreateQueryDef("qryTopSQL_" & i, qryTopSQL)
i = i + 1
Next Item
' UNION QUERY
j = 1
For Each Item In Associates
If j = 1 Then
qryTopSQL = "SELECT TOP " & QA# & _
" Date, ID, [L#], Deal, RndNum FROM tbl_Data WHERE Date Between #" & _
StartDate & "# And #" & EndDate & "# AND ID = " & Item & _
" ORDER BY RndNum"
Else
' UNIONS ARE SIMPLY STACKS OF SELECT STATEMENTS OF SAME COLUMN NUMBER AND DATA TYPE
' TOGETHER JOINED BY THE UNION OR UNION ALL CLAUSE
qryTopSQL = qryTopSQL & " UNION SELECT TOP " & QA# & _
" Date, ID, [L#], Deal, RndNum FROM tbl_Data WHERE Date Between #" & _
StartDate & "# And #" & EndDate & "# AND ID = " & Item & _
" ORDER BY RndNum"
End if
j = j + 1
Next Item
Set qryTopUnionqdef = CurrentDb.CreateQueryDef("qryTopSQLUnion", qryTopSQL)
' UNINTIALIZE OBJECTS
Set qryTopqdef = nothing
Set qryTopUnionqdef = nothing
另请参阅此 SO post 集合与数组
我正在尝试编写代码来生成关联 ID 的集合(关联是我的集合的名称)。在任何给定时间都有 10 位同事,但集合会根据谁在本月做了什么工作而改变。因此,一旦收集完成,我想遍历它并为每个项目创建一个 SQL 语句。有点像这样:
For Each Item In Associates
qryTopSQL = "SELECT TOP " & QA# & _
" Date, ID, [L#], Deal, RndNum FROM tbl_Data WHERE Date Between #" & _
StartDate & "# And #" & EndDate & "# AND ID = " & Associates() & _
" ORDER BY RndNum"
Next Item
所以我最终得到了很多 SQL 个字符串,但我遇到了问题:
- 我写的
ID = " & Associates() & "
部分正确吗? - 它将如何命名这些不同的字符串以便我以后可以访问它们?
- 完成这些后,我想对所有 SQL 字符串执行
UNION ALL
查询。我该怎么做?
如果可以请帮忙,不胜感激。我是集合和数组的新手,我不明白我在网上找到的一些东西。
编辑更新: 我试过这个:
j = 1
k = 1
For Each Item In Associates
If j = 1 And k = 1 Then
qryTopString1 = "SELECT * FROM qryTopSQL_" & k
Else
qryTopString2 = " UNION ALL SELECT * FROM qryTopSQL_" & k
End If
j = j + 1
k = k + 1
Next Item
'
Set qryTopUnionqdef = CurrentDb.CreateQueryDef("qryTopSQLUnion", qryTopString1 & qryTopString2)
但结果查询是第一个和最后一个 TopSQL 之间的并集,中间的 none。显然此时的循环是问题所在,但到目前为止我还不知道该怎么做。
在 Access 中,有两种创建查询对象的方法:VBA 查询(在代码中)或存储查询(使用功能区、向导或导航栏)。
本质上,你想两者兼顾。因此,为了将您的 VBA SQL 字符串迁移到实际存储的查询对象中,您必须使用 QueryDefs。下面是如何迭代以动态创建 10 个关联查询和 1 个联合查询。
Dim qryTopqdef As QueryDef, qryTopUnionqdef As QueryDef, findqdf As QueryDef
Dim i as Integer, j as Integer
' DELETE QUERIES IF EXIST
For each findqdf in CurrentDb.Querydefs
If Instr(findqdf.Name, "qryTopSQL") > 0 Then
db.QueryDefs.delete(findqdf.Name)
End if
Next findqdf
' INDIVIDUAL 10 QUERIES
i = 1
For Each Item In Associates
qryTopSQL = "SELECT TOP " & QA# & _
" Date, ID, [L#], Deal, RndNum FROM tbl_Data WHERE Date Between #" & _
StartDate & "# And #" & EndDate & "# AND ID = " & Item & _
" ORDER BY RndNum"
' QUERY NAMES ARE SUFFIXED BY THE ITERATOR COUNT
Set qryTopqdef = CurrentDb.CreateQueryDef("qryTopSQL_" & i, qryTopSQL)
i = i + 1
Next Item
' UNION QUERY
j = 1
For Each Item In Associates
If j = 1 Then
qryTopSQL = "SELECT TOP " & QA# & _
" Date, ID, [L#], Deal, RndNum FROM tbl_Data WHERE Date Between #" & _
StartDate & "# And #" & EndDate & "# AND ID = " & Item & _
" ORDER BY RndNum"
Else
' UNIONS ARE SIMPLY STACKS OF SELECT STATEMENTS OF SAME COLUMN NUMBER AND DATA TYPE
' TOGETHER JOINED BY THE UNION OR UNION ALL CLAUSE
qryTopSQL = qryTopSQL & " UNION SELECT TOP " & QA# & _
" Date, ID, [L#], Deal, RndNum FROM tbl_Data WHERE Date Between #" & _
StartDate & "# And #" & EndDate & "# AND ID = " & Item & _
" ORDER BY RndNum"
End if
j = j + 1
Next Item
Set qryTopUnionqdef = CurrentDb.CreateQueryDef("qryTopSQLUnion", qryTopSQL)
' UNINTIALIZE OBJECTS
Set qryTopqdef = nothing
Set qryTopUnionqdef = nothing
另请参阅此 SO post 集合与数组