首页 > 解决方案 > MS-Access:循环遍历表中每个不同值的代码

问题描述

我的访问数据库中有一个名为 Table_Example_1 的表。目前,我有一个循环,该循环根据表中的 [Flag] 字段循环执行代码,因此如果所有内容都设置为“Flag_1”,它会循环遍历这些记录并执行代码以创建字符串输出。

但是,有些项目具有相同的标志,例如“Flag_1”,但它们需要与具有相同值的其他记录分开执行。我添加了一个名为 [Grouped] 的字段,我想做的是使用该字段循环遍历该分组中的所有内容以获取相同的标志。

因此,如果有 2 条记录设置为 Flag_1 并且都是第 1 组,那么它们将在同一个循环中运行。第 2 组中带有 Flag_1 的记录将在单独的循环中运行。(这些结果将在最后合并)

我的相关数据表如下:

Business        Type            TableName   FieldName   Flag    Grouped
Red             Residential     RedTable    [Field_1]   Flag_1      1
Red             Residential     RedTable    [Field_1]   Flag_1      1
Red             Residential     RedTable    [Field_1]   Flag_1      1
Red             Residential     RedTable    [Field_2]   Flag_1      2
Red             Residential     RedTable    [Field_2]   Flag_1      2

我当前的代码如下,此代码目前仅循环通过具有相同标志的记录,并且不考虑它们的分组。

所以我想要对下面的代码做的是以某种方式添加一个检查分组并查看所有组的部分,然后我的下面的循环将嵌套在这个部分中。

我首先需要从记录集中获取不同数量的组。我提供的示例只有第 1 组和第 2 组,但每次都会有所不同。

然后我想在下面的循环中嵌套。我正在考虑使用 for 循环,但我不确定如何检查记录集中的组数并为每个组执行此操作。

 Public Function CreateFilterString(Business As String, Type As String, TableName As String)
        'Define variables
        Dim resultString_1 As String
        Dim resultStringFinal As String
        Dim recSet As Recordset
        
        'Flag_1 Related Flag RecordSet
        Set recSet = CurrentDb.OpenRecordset("SELECT * FROM Table_Example_1 WHERE Table_Example_1.TableName = '" & TableName & "' AND Table_Example_1.Business = '" & Business & "' AND Table_Example_1.Type = '" & Type & "' AND Table_Example_1.Flag = 'Flag_1' ")
        
        'If there is no data in the recordset, then set the resultString_1 to blank
        If recSet.RecordCount = 0 Then
            resultString_1 = ""
        'Otherwise execut the following
        Else
            
            'If there is data in the recordset and the Flag field is Flag_1
            If recSet.RecordCount > 0 And recSet.Fields(7).Value = "Flag_1" Then
            
            'Set the resultString variable
            recSet.MoveFirst ' recSet now contains first record from the query
            While Not (recSet.EOF)
                'If it is the first case in the recordset
                If recSet.RecordCount = 1 Then
                    'code executed here that sets value of resultString_1
                Else
                    'code executed here that sets value of resultString_1
                End If
            'moves to next record
            recSet.MoveNext
            Wend 'end while
            
            recSet.Close 'close recordset when done
            
            'End of Flag_1 Related Flag
            End If
        End If
        
        'Set the result variable returned by the function
        CreateFilterString = resultStringFinal
        
        End Function

编辑:所以总结并希望澄清我想要的:

我希望能够从 GROUPING 字段中获取不同的值,然后遍历这些值中的每一个。我需要一个遍历“分组”字段中每个唯一值的循环。因此,它将对分组为 1 的任何记录执行一次,然后到达循环的末尾并为分组为 2 的任何记录重新运行。

我知道我可以创建一个记录集
CurrentDb.OpenRecordset("SELECT DISTINCT Grouped FROM Table_Example_1 WHERE ...来获取唯一值,但我不知道如何使用这些信息来创建一个循环来遍历 GROUPED 字段中的每个值。

提前致谢

标签: vbams-access

解决方案


如果我理解你的问题,你需要两个循环。一种用于检索唯一组,另一种用于检索特定组的数据。

像这样的东西:

Public Sub T()
    On Error GoTo Trap
    
    Dim rGroup As DAO.Recordset, rData As DAO.Recordset
    Dim idx As Long
    
    'Get groups
    Set rGroup = CurrentDb().OpenRecordset("SELECT DISTINCT Grouped FROM Table", dbOpenSnapshot)
    If rGroup.EOF Then GoTo Leave
    With rGroup
        .MoveLast
        .MoveFirst
    End With
    
    'Loop through unique groups and get data for each group
    For idx = 1 To rGroup.RecordCount
        Set rData = CurrentDb().OpenRecordset("SELECT * FROM Table WHERE Grouped=" & rGroup![Grouped], dbOpenSnapshot)
        
        'Now the rData holds data specific to a group
        'Do more work
        
        rData.Close
        rGroup.MoveNext
    Next idx
    
Leave:
   If Not rData Is Nothing Then rData.Close
   If Not rGroup Is Nothing Then rGroup.Close
   Exit Sub
   
Trap:
    MsgBox Err.Description, vbCritical
    Resume Leave
End Sub

推荐阅读