【问题标题】:Access 2007 VBA code returns only the first record of the loopAccess 2007 VBA 代码仅返回循环的第一条记录
【发布时间】:2013-12-10 20:07:17
【问题描述】:

我有两个表,我试图从表 B 中获取数据到表 A。如果在表 B 中找不到表 A 的 ID,则将其保留为空。 例如。

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

我目前的代码只返回表 A 中的第一个相似记录。它不返回下一个匹配记录(例如,它为 AID 88 返回 3,但不为 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

【问题讨论】:

  • 首先,您需要确保按 id 订购表格。而且我在您的代码中没有看到类似 rs1.MoveNext 的内容。这段代码对吗?

标签: vba loops ms-access-2007


【解决方案1】:

我可能是错的,但看起来您是在 VBA 中重新创建 SQL。下面的 SQL 更简单,可能会运行得更快。

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

【讨论】:

  • 在尝试 VBA 之前,我尝试在 SQL 中执行此操作。现在我有Else rs2.Edit rs2.Fields("Sttl") = Null rs2.Update End If 但是,这是在测试环境中。我将添加一个表达式而不是 null。例如。 If ID = 4 then Sttl = 1.5 * field2 我在 SQL 中看不到这样做
  • 我认为您可以通过使用第二个 Update 语句来解决这个额外的要求。您可以使用查找表来决定当 ID 字段是某个值或在某个值范围内时要执行的操作。如果您不想在 Access 中使用查找表,您可以使用嵌套的 IF 语句来确定如何进行更新,或者在 SQL Server 中您可以使用 CASE 语句来枚举所有不同的场景。跨度>
  • 我需要 3 个更新语句才能完成工作。感谢所有的建议。它现在运行良好。
【解决方案2】:

许多人忘记了,除了排序之外,您无法确定表格的顺序。因此,您必须进行搜索,并检查是否找到了某些东西。

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

【讨论】:

  • 感谢 Jorg,在这种情况下这对我不起作用,但我可以在另一个表上使用代码。
猜你喜欢
  • 2022-01-27
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多