0

シリアル番号を主キーとして使用して 2 つのテーブルを比較しようとしています。サイズが異なる可能性があるため、シリアル番号は SerialAccount_a ではなく、SerialAccount_b にある場合があります。これが発生すると、1 つのレコードセットが進み、もう 1 つのレコードセットがシリアルを見つけようとするため、ファイルの終わりに到達します。その後、エラー 3021 が返されます。エラー処理を行っていますが、エラーが発生した後にコードで残りのデータの比較を再開したいのですが、そうするのに問題があります。あなたが私を助けることができれば、それは素晴らしいことです. このサブプログラムを改善する方法について他に提案があれば、それも良いでしょう。

Public Sub compareSerialAccount()

Dim dbs As DAO.Database
Dim rstA As DAO.Recordset
Dim rstB As DAO.Recordset
Dim rstFiltered As DAO.Recordset
Dim serialNumber As String
On Error GoTo HandleErrors

Set dbs = CurrentDb
counter1 = 0
' Opens the recordsets of SerialAccount_a and _b in
' preperation for comparison of data
Set rstA = dbs.OpenRecordset("SerialAccount_a", dbOpenDynaset)
Set rstB = dbs.OpenRecordset("SerialAccount_b", dbOpenDynaset)

Do Until rstB.EOF

Do Until rstA.EOF
    If rstA.Fields("serial") = rstB.Fields("serial") Then
        If rstA.Fields("accountnumber") <> rstB.Fields("accountnumber") Then
            ' Print message
            counterForMessage = counterForMessage + 1
        End If
        If rstA.Fields("model_number") <> rstB.Fields("model_number") Then
            ' Print message
            counterForMessage = counterForMessage + 1
        End If
    Else
    ' This will always be the default until there are two matching serial numbers
    ' This will advnace rstA +1 and make rstFiltered stay put
    ' I had to work around the advancements on the outside of this statement
    ' Thats why I move rstA (+1 = 1) and rstFiltered (-1 +1 = 0)
        rstB.MoveNext
        rstA.MovePrevious
    End If
    rstA.MoveNext
Loop
rstB.MoveNext
Loop

If counterForMessage = 0 Then
Debug.Print "| There are no discrepancies between SerialAccount_a and SerialAccount_b!                                 |"
End If

HandleErrors:
Select Case Err.Number

    Case 3021
    serialNumberForError = rstA.Fields("serial")
    Debug.Print "| Serial number " & serialNumberForError & " was either added or deleted."
    Resume Next

End Select

End Sub
4

1 に答える 1