Ms Access 比较两个记录集

Posted

技术标签:

【中文标题】Ms Access 比较两个记录集【英文标题】:Ms Access Comparing two recordsets 【发布时间】:2009-09-09 10:59:00 【问题描述】:

我正在尝试比较两个记录集。第一个 rs1 有随机记录。第二个 rs2 具有这些记录的标准值。最初,我希望获取每条记录,看看它们是否与第二个记录集中的标准值集匹配。每个记录集中有四个字段要比较,并且四个字段都必须匹配。

我只是需要一些帮助。我正在尝试将不匹配的记录写入 excel 文件。 这是我到目前为止所拥有的

While Not rs1.EOF                                       
    With rs1
        .MoveFirst
        With rs2
            .MoveFirst
            While Not rs2.EOF
                counter = counter + 1
                a = 0
                If rs1!Kk = rs2!Kk Then a = a + 1
                If rs1!CC = rs2!CC Then a = a + 1
                If rs1!HN = rs2!HN Then a = a + 1
                If rs3!TN = rs2!TN Then a = a + 1

                If a > 3 Then GoTo correct
                .MoveNext

                If rs2.EOF Then
                    If rs!Table_Name <> "table1" Then
                        i = i + 1
                        j = 1
                        counter = counter + 1
                        objSht.Cells(i, j).Value = "casenum" & rs1.Fields(1)
                        j = j + 1
                        stat_counter = stat_counter + 1
                    End If

                    If i = 65500 Then
                        Set wbexcel = objexcel.ActiveWorkbook
                        ''//Set objSht = wbexcel.Worksheets("Sheet2")
                        Set objSht = wbexcel.Worksheets.Add
                        i = 2
                    End If
                End If                                        
correct:
                rs1.MoveNext
            Wend
        End With
    End With

还有关于我如何根据与标准匹配的 2 个字段和与标准值匹配的 3 个字段进行隔离的任何想法

【问题讨论】:

那么你有什么问题/问题?? 【参考方案1】:

记录集是否已经排序?我猜是这种情况,因为您在不匹配时移至下一个rs2。就我个人而言,我会指定一种 100% 确定的排序方式。

此外,我会使用带有一些边缘情况的小型测试数据集对此进行彻底测试,以确保您得到预期的结果。

考虑到上述内容,您的代码看起来可以工作,但我有一些小建议可以使其更易于阅读。

首先我建议放弃嵌套的With rs1With rs2。只需明确引用每个记录集,您就可以清楚地看到每个 rs 发生了什么。例如:

If a > 3 Then GoTo correct
                .MoveNext

变成

If a > 3 Then GoTo correct
               rs2.MoveNext

接下来你的 if 语句与 a = a + 1 可以做一些整理。例如:

If rs1!Kk = rs2!Kk and rs1!CC = rs2!CC and rs1!HN = rs2!HN and rs3!TN = rs2!TN then
  ''// Do Nothing or maybe increase a count or whatever :)
else
  WriteToExcel(objSht , rs1.fields)
end if

您需要编写一个名为 WriteToExcel() 的函数,但这将使下一步更容易。我想你想根据比赛写不同的表格吗?

If rs1!Kk = rs2!Kk and rs1!CC = rs2!CC and rs1!HN = rs2!HN and rs3!TN = rs2!TN then
  ''// Do Nothing
else if rs1!Kk = rs2!Kk and rs1!CC = rs2!CC and rs1!HN = rs2!HN then
  WriteToExcel(objSht2 , rs1.fields)
else
  WriteToExcel(objSht , rs1.fields)
end if

在需要任意两个匹配的情况下,您可能还想查看开关,而不是上面的特定匹配...哦,variable j 似乎有点多余。

【讨论】:

【参考方案2】:

我的直觉告诉你,你做的事情并不理想;但是,在 if 语句 If rs2.EOF Then 中,为什么不添加与 a 的比较,然后针对 0、1、2 和 3 重定向到不同的 Excel 文件

蛮力和无知,但绝对是分开的。

【讨论】:

以上是关于Ms Access 比较两个记录集的主要内容,如果未能解决你的问题,请参考以下文章

为啥要克隆 MS-Access 记录集?

MS Access ADO 记录集和二维数组

无法更新加入的记录集 - MS Access

大型记录集 (VBA) 的 MS Access 插入慢

MS Access ADP 断开连接的记录集恢复

WHERE IN 在 Access VBA 中使用两个记录集进行查询