vba - 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
我当前的代码如下,此代码目前仅循环通过具有相同标志的记录,并且不考虑它们的分组。
- 它使用 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 字段中的每个值。
提前致谢
解决方案
如果我理解你的问题,你需要两个循环。一种用于检索唯一组,另一种用于检索特定组的数据。
像这样的东西:
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
推荐阅读
- arduino - 不能从 C 中断 Arduino Uno 的引导加载程序
- hbase - HBase:有没有办法在从 hbase 硬删除行时停止创建墓碑标记?
- red-black-tree - 将元素插入到只需要颜色更改且无需旋转的红/黑树中?
- javascript - ReactJS 丢弃所有包含的 css 文件
- bash - 如果第 2 列字段具有多个值,则格式化输出
- html - 悬停图像问题
- python - PySpark:使用选定的列或分区优化从 Delta 读取/加载
- javascript - 用于随机生成内容的不同 Twitter 分享按钮
- java - JSON 对象构建不正确
- sql - 无法理解 GROUPING_ID() 函数在我的情况下是如何工作的