【问题标题】:Comparing recordset values in Access VBA比较 Access VBA 中的记录集值
【发布时间】:2017-03-06 13:29:41
【问题描述】:

我正在尝试比较 access VBA 中的两个记录集,以检查两个表中的值是否相同或是否不同。两个记录集具有相同的结构(字段标题)和记录 ID,我正在尝试检查记录的字段值是否与第二个记录集中的相应字段值匹配。记录 ID 字段名称为 MATNR。

我想我已经设法遍历了第一个记录集的记录和字段,但我不确定如何遍历这些记录并将这些记录与第二个记录进行比较。另外,除了If rs1.Fields(fld.Name) = rs2.Fields(fld.Name)之外,还有更聪明的方法来比较记录集吗?

任何帮助将不胜感激。

    Public Sub VerifyRecords()

        Dim rs As DAO.Recordset
        Dim rs1 As DAO.Recordset
        Dim rs2 As DAO.Recordset
        Dim rs3 As DAO.Recordset
        Dim fld As DAO.Field
        Dim sSQL As String
        Dim sSQL1 As String
        Dim sSQL2 As String

    Set rs = CurrentDb.OpenRecordset("R2_Tables_to_Compare1") 'This table lists the upload tables to query and their corresponding target tables
    Set rs3 = CurrentDb.OpenRecordset("RecordValueComparisonResults") 'Write the results of the record vlaue comparison to here

    '**************************************************************************************
    'This SQL statement selects all records from the upload table

        sSQL = "SELECT * "
        sSQL = sSQL & " FROM " & rs(0)

    Set rs1 = CurrentDb.OpenRecordset(sSQL)

    '**************************************************************************************
    'This SQL statement selects only those records that are applicable in the target table

        sSQL1 = "SELECT " & rs(1) & ".* FROM " & rs(1) & " INNER JOIN " & rs(0) & " ON " & rs(1) & ".MATNR = " & rs(0) & ".MATNR"

    Set rs2 = CurrentDb.OpenRecordset(sSQL1)
    '**************************************************************************************
     Do While Not rs1.EOF
                For Each fld In rs1.Fields
                       If rs1.Fields(fld.Name) = rs2.Fields(fld.Name) Then
                            Debug.Print rs1.Fields("MATNR"), rs2.Fields("MATNR"), fld.Name, rs1.Fields(fld.Name), rs2.Fields(fld.Name)
                    End If
                Next fld
            rs1.MoveNext
    Loop


rs.Close
rs1.Close
rs2.Close
rs3.Close

Set rs = Nothing
Set rs1 = Nothing    
Set rs2 = Nothing    
Set rs3 = Nothing

    End Sub

【问题讨论】:

  • 如果您正在处理 RDBMS 中的记录并开始考虑循环,那么您做错了。可以肯定的是,它所做的任何事情都可以表示为一个普通的 SQL 查询。

标签: vba ms-access recordset


【解决方案1】:

以下是两个选项,尽管在 Access 和任何关系数据库中工作时 QUERY OPTION 更快更好:

  1. QUERY OPTION:这个查询可以被传递到一个记录集中,并且该记录集将只包含两个表中的字段之间的匹配值。然后,您可以循环访问该新记录集,并根据需要使用单个循环进行打印或处理。

    SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
  2. LOOP OPTION:如果您打算循环通过两个记录集,请使用此代码。可能有一种更有效的方法可以做到这一点,特别是因为这种方法使用四个嵌套循环,这是一个禁忌。我强烈推荐查询选项。

    虽然不是 rs1.EOF
       虽然不是 rs2.EOF
         对于 rs1.Fields 中的每个 fld1
           对于 rs2.Fields 中的每个 fld2
             如果 rs1.Fields(fld1.Name) = rs2.Fields(fld2.Name) 那么
                 Debug.Print rs1.Fields("MATNR"), rs2.Fields("MATNR"), fld1.Name,
                             rs1.Fields(fld1.Name), rs2.Fields(fld2.Name)
             万一
           下一个 fld2
         下一个 fld1
           rs2.MoveNext
       文德
       rs2.MoveFirst
       rs1.MoveNext
     温德

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    相关资源
    最近更新 更多