比较 Access 中的记录集值 VBA
Comparing recordset values in Access VBA
我正在尝试比较访问 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
下面是两个选项,尽管在 Access 和任何关系数据库中工作时 QUERY OPTION 更快更好:
QUERY OPTION: 可以将此查询传递到记录集中,并且记录集将仅包含两个表中字段之间的匹配值。然后您可以循环遍历该新记录集并根据需要使用单个循环进行打印或处理。
SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
循环选项:如果您打算循环遍历两个记录集,请使用此代码。可能有更有效的方法来执行此操作,特别是因为此方法使用四个嵌套循环,这是一个禁忌。我强烈推荐 QUERY OPTION。
While Not rs1.EOF
While Not rs2.EOF
For Each fld1 in rs1.Fields
For Each fld2 in rs2.Fields
If rs1.Fields(fld1.Name) = rs2.Fields(fld2.Name) Then
Debug.Print rs1.Fields("MATNR"), rs2.Fields("MATNR"), fld1.Name,
rs1.Fields(fld1.Name), rs2.Fields(fld2.Name)
End If
Next fld2
Next fld1
rs2.MoveNext
Wend
rs2.MoveFirst
rs1.MoveNext
Wend
我正在尝试比较访问 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
下面是两个选项,尽管在 Access 和任何关系数据库中工作时 QUERY OPTION 更快更好:
QUERY OPTION: 可以将此查询传递到记录集中,并且记录集将仅包含两个表中字段之间的匹配值。然后您可以循环遍历该新记录集并根据需要使用单个循环进行打印或处理。
SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
循环选项:如果您打算循环遍历两个记录集,请使用此代码。可能有更有效的方法来执行此操作,特别是因为此方法使用四个嵌套循环,这是一个禁忌。我强烈推荐 QUERY OPTION。
While Not rs1.EOF While Not rs2.EOF For Each fld1 in rs1.Fields For Each fld2 in rs2.Fields If rs1.Fields(fld1.Name) = rs2.Fields(fld2.Name) Then Debug.Print rs1.Fields("MATNR"), rs2.Fields("MATNR"), fld1.Name, rs1.Fields(fld1.Name), rs2.Fields(fld2.Name) End If Next fld2 Next fld1 rs2.MoveNext Wend rs2.MoveFirst rs1.MoveNext Wend