访问 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 个字符串,但我遇到了问题:

  1. 我写的 ID = " & Associates() & " 部分正确吗?
  2. 它将如何命名这些不同的字符串以便我以后可以访问它们?
  3. 完成这些后,我想对所有 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 集合与数组