2013-12-10 3 views
0

두 개의 테이블이 있는데 테이블 B의 데이터를 테이블 A로 가져 오려고합니다. 테이블 A의 ID가 테이블 B에서 발견되지 않으면 null로 두십시오. 예 :Access 2007 VBA 코드는 루프의 첫 번째 레코드 만 반환합니다.

   AID Sttl     BID  Sttl 
      4        88  3 
      20        92  2 
      88  3      100  8 
      92  2      500  10 
      800        

코드 I 현재에만 그 다음 일치하는 레코드를 반환하지 않습니다 테이블 A의 첫번째 유사한 레코드를 반환 (예를.는 AID 88 세를 반환하지만 AID92 아무것도 반환하지 않습니다). 나는 무엇을 놓치고 있습니까?

Dim db As dao.Database 
Dim rs1 As dao.Recordset 
Dim rs2 As dao.Recordset 

Set db = CurrentDb() 
Set rst1 = db.OpenRecordset(cstrFromtbl, dbOpenDynaset) 
Set rst2 = db.OpenRecordset(cstrTotbl, dbOpenDynaset) 

Do While Not rs2.EOF 
If rs2.Fields("A.ID") = rs1.Fields("B.ID") Then 
    rs2.Edit 
    rs2.Fields("Sttl") = rs1.Fields("Sttl") 
    rs2.Update 
Else 
    rs2.Edit 
    rs2.Fields("Sttl") = Null 
    rs2.Update 
End If 
rs2.MoveNext 
Loop 

Set rs1 = Nothing 
Set rs2 = Nothing 
Set dbs = Nothing 

End Function 
+0

먼저 id로 테이블을 주문했는지 확인해야합니다. 그리고 당신의 코드에서 rs1.MoveNext와 같은 것이 보이지 않습니다. 이 코드가 맞습니까? – Makah

답변

2

내가 틀릴 수도 있지만 VBA에서 SQL을 다시 만드는 것처럼 보입니다. 아래의 SQL은 더 간단하고 훨씬 더 빠르게 실행됩니다.

UPDATE tablea 
INNER JOIN tableb 
ON tablea.idfield = tableb.idfield 
SET tablea.destinationfield = tableb.sourcefield 
+0

VBA를 시도하기 전에 SQL에서이 작업을 시도했습니다. 지금 당장은''Else rs2.Edit rs2.Fields ("Sttl") = Null rs2.Update End If'라고합니다. 그러나 이것은 테스트 환경에 있습니다. null 대신 표현식을 추가 할 것입니다. 예. 'ID = 4이면 Sttl = 1.5 * field2'SQL에서이 작업을 수행 할 사람이 없습니다. –

+0

두 번째 Update 문을 사용하여이 추가 요구 사항을 해결할 수 있다고 생각합니다. 조회 테이블을 사용하여 ID 필드가 특정 값이거나 값 범위 내에있을 때 수행 할 작업을 결정할 수 있습니다. Access에서 검색 테이블을 사용하지 않으려면 중첩 된 IF 문을 사용하여 업데이트 방법을 결정하거나 SQL Server에서 모든 다른 시나리오를 열거 할 수있는 CASE 문을 사용할 수 있습니다. – bf2020

+0

작업을 완료하려면 3 개의 update 문이 필요합니다. 모든 제안을 주셔서 감사합니다. 그것의 실행 prefectly 지금. –

1

많은 사람들이 잊어 버린 점은 정렬을 제외하고는 테이블의 순서에 대해 확신 할 수 없다는 것입니다. 당신은 수색을해야하고, 무언가가 발견되었는지 확인해야합니다.

Do While Not rs2.EOF 
    rs1.FindFirst("ID=" & rs2.Fields("A.ID")) 
    rs2.Edit 
    If rs1.NoMatch Then 
    rs2.Fields("Sttl") = Null 
    Else 
    rs2.Fields("Sttl") = rs1.Fields("Sttl") 
    EndIF 
    rs2.Update 
    rs2.MoveNext 
Loop 
+0

Jorg에게 감사드립니다.이 경우에는 나에게 도움이되지 못했지만 다른 테이블에서 코드를 사용할 수있었습니다. –

관련 문제