2013-12-10 116 views
0

我有兩個表,我試圖從表B中獲取數據到表A中。如果表A的ID在表B中找不到,則將其保留爲空。例如,Access 2007 VBA代碼只返回循環的第一條記錄

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

的代碼我現在有隻返回表A的第一個類似的記載不退還的下一個匹配記錄(例如,它返回3 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」)=空rs2.Update End If'然而,這是在一個測試環境中。我將添加一個表達式而不是null。例如。 '如果ID = 4,則sttl = 1.5 * field2'我沒有看到ay在SQL中執行此操作 –

+0

我認爲您可以通過使用第二個Update語句來解決這一額外需求。您可以使用查找表來決定在ID字段爲特定值或值範圍內時要執行的操作。如果您不想在Access中使用查找表,則可以使用嵌套的'IF'語句來確定如何執行更新,或者在SQL Server中,您可以使用'CASE'語句來枚舉所有不同的場景。 – bf2020

+0

我需要3條更新語句才能完成工作。感謝所有的建議。它現在正在運行。 –

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,在這種情況下,這對我無效,但我能夠在另一張桌子上使用代碼。 –