2013-07-24 9 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 절)을 조금 건너 뛴 것처럼 보입니다. 전체 테이블을 반복하고 각 행을 테스트하는 것은 거의 필요하지 않습니다. –