2013-07-24 153 views
0

我想通過使用序列號作爲主鍵來比較兩個表。由於它們的大小可能不同,因此序列號可能在SerialAccount_b中,而不在SerialAccount_a中。發生這種情況時,由於一個記錄集提前,而另一個記錄集試圖找到序列號,所以我會到文件末尾。然後它返回錯誤3021.我有它的錯誤處理,但我希望代碼繼續比較其他數據發生這種情況後,我遇到麻煩這樣做。如果你能幫助我,那會很棒。如果您對如何改進此子程序有任何其他建議,那也不錯。處理錯誤3021(EOF)VBA

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 

回答

3

我不知道你爲什麼這樣做。您可以在Access中創建查詢,即使使用查找不匹配的查詢嚮導。這將在一張表中找到那些不在另一張表中的記錄。如果您還希望在第二個表格中找到不在第一個表格中的那些,則可以創建其中的兩個。

如果希望以編程方式執行此操作,請借用嚮導創建的SQL語句,然後研究table-joins

已添加迴應評論: 您正在根據表名打開記錄集。這些包含每個表的所有數據。您可以改爲使用僅檢索數據(來自行)的SQL語句,其中表的一個字段中的值不會出現在另一個表的字段中,以及您需要的任何其他條件。您可以按照與現在相同的方式遍歷結果記錄集,但記錄集只包含您感興趣的行。您可以檢查RecordCount以確認是否檢索到任何記錄。

+0

代碼有效。這只是處理這個錯誤。使用SQL不會幫助我,因爲我現在無法像使用數據那樣使用數據,因爲它只返回行。如果我錯了,請糾正我。 – heinst

+0

我已添加到我的答案。您似乎在數據庫研究中跳過了一些內容:SQL語句,表連接,條件(WHERE子句)。循環遍歷整個表並測試每一行很少(如果有的話)是必要的。 –