【问题标题】:MS-Access: Loop through code for each distinct value in a tableMS-Access:循环遍历表中每个不同值的代码
【发布时间】:2020-12-02 02:31:46
【问题描述】:

我的 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

我当前的代码如下,该代码目前只循环遍历具有相同标志的记录,不考虑它们的分组。

  • 它使用 Flag_1 为所有内容设置记录集和过滤器
  • 然后循环遍历记录集并执行代码来设置结果变量。

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

我首先需要从记录集中获取不同数量的组。我提供的示例只有第 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 字段。

提前致谢

【问题讨论】:

  • 您可以使用SELECT DISTINCT Grouped FROM Table_Example_1 WHERE ... 获得唯一组的数量。不同组的数量将是recSet.RecordCount。我不太明白,你想用这些信息做什么
  • 我不完全确定如何获得不同数量的组并遍历每个值。我知道我可以使用 SELECT DISTINCT Grouped FROM Table_Example_1 WHERE 创建记录集以获取唯一值,但我不知道如何使用此信息来创建循环以遍历 GROUPED 字段中的每个值.但我基本上想要的是创建一个循环,遍历“分组”字段中的每个唯一值。因此,它将对分组为 1 的任何记录运行一次,然后到达末尾并为分组为 2 的任何记录重新运行

标签: vba ms-access


【解决方案1】:

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

类似这样的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2019-01-25
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多