比较 VBA Access 中的表
Posted
技术标签:
【中文标题】比较 VBA Access 中的表【英文标题】:Compare tables in VBA Access 【发布时间】:2014-11-14 19:11:49 【问题描述】:我正在尝试比较 VBA 访问中的两个表,以查看其中是否有需要添加到另一个的新客户端。我开始开发比较循环,但由于某种原因它不起作用。这是说客户端 ID 字段对于一个表中的所有记录的值为 6,这是不正确的。我不确定我是否在If
语句中引用了它。对此主题的任何帮助将不胜感激。
dte = InputBox("What date was the Data Dump run?", "Please Input a date")
tableName = "FN_DataDump_ALL_" & dte
Set dataDump = db.OpenRecordset(tableName, dbOpenDynaset, dbEditAdd)
Set clientTable = db.OpenRecordset("Clients", dbOpenDynaset, dbEditAdd)
With dataDump
.MoveFirst
Do
If dataDump("[Client ID]") <> clientTable("[Client ID]") Then
MsgBox (dataDump("[Client ID]"))
clientTable.MoveNext
Else: MsgBox ("Match.")
.MoveFirst
End If
Loop Until .EOF
End With
更新:
由于某种原因,VBA 一直说它找不到表 DataDump,当它正确打开时等等。我在尝试运行 SQL 时抛出了这个错误,所以我认为我的语句有问题。
Set db = CurrentDb
dte = InputBox("What date was the Data Dump run?", "Please Input a date")
tableName = "FN_DataDump_ALL_" & dte
Set DataDump = db.OpenRecordset(tableName, dbOpenDynaset, dbEditAdd)
Set clientTable = db.OpenRecordset("Clients", dbOpenDynaset, dbEditAdd)
mysql = "SELECT DISTINCT CL.[Client ID] " & _
"INTO Clients " & _
"FROM Clients AS CL " & _
"Where CL.[Client ID] NOT IN (SELECT DD.[Client ID] FROM DataDump AS DD) "
更新 #2:
现在它说我有一个语法错误,我真的很困惑它是什么。
"Where CL.[Client ID] NOT IN (SELECT DD.[Client ID] ""FROM"" & tableName ""as DD"") "
【问题讨论】:
您的数据库是否包含名为 DataDump 的表或查询? 不是那个名字,但我用那个名字在 VBA 中打开它,所以它应该没关系吧? 好的,我明白了。 DataDump 是一个记录集对象。不,您不能SELECT FROM
记录集。
哦,我明白了。所以我应该把它改成它在数据库中的表名?
是的,我想你想在那里使用 tableName 变量的值。
【参考方案1】:
首先,你有一个 .MoveFirst,你应该有一个 .MoveNext
但是,更好的方法是使用 NOT IN 查询。我会这样做:
tableName = "FN_DataDump_ALL_" & dte
Set dataDump = db.OpenRecordset(tableName, dbOpenDynaset, dbEditAdd)
Set clientTable = db.OpenRecordset("Clients", dbOpenDynaset, dbEditAdd)
MySQL = "SELECT DISTINCT CL.[Client ID] " & _
"INTO TempClients " & _
"FROM Clients AS CL " & _
"Where CL.[Client ID] NOT IN (SELECT DD.[Client ID] FROM " & tableName & " AS DD) "
DoCmd.RunSQL (MySQL)
现在您已经在名为“rec”的数据集中获得了客户 ID 列表。这将比遍历每条记录并比较 ID 更有效,除非您的表非常小,并且熟练程度的差异可以忽略不计。
【讨论】:
谢谢!一个问题,我是否可以使用INTO
语句将它们插入到客户表中?如果是这样,我会把它放在哪里?
取决于表是否存在。您可以使用 INSERT INTO 或 SELECT blah blah INTO。是的,你可以很容易地将它添加到 MySql,但是你需要一个 DoCmd.RunQuery 因为它会将它变成一个动作查询。
SELECT ... INTO 是如果表存在,INSERT INTO 是如果表不存在。如果您使用 INSERT INTO,它将在 SELECT 语句之前。如果您使用的是 SELECT ... INTO,那么 INTO 部分将位于 FROM 子句之前。
查看此链接作为示例(如果您查看页面左侧,您还会看到指向 INSERT INTO 语句的链接):msdn.microsoft.com/en-us/library/bb208934(v=office.12).aspx
谢谢!在这种情况下,我会把它放在第一个 FROM
之前对吗?【参考方案2】:
我同意 Johnny 的观点,即查询是更好的选择。 Microsoft Access 实际上有一个内置的查询生成器来执行此操作,并制作了一个教程,可以在下面的链接中找到。这显然不会直接转换为 VBA,但您可以构建查询或在 VBA 代码中使用它。
Find records without matches
【讨论】:
以上是关于比较 VBA Access 中的表的主要内容,如果未能解决你的问题,请参考以下文章
如何使用查询或 VBA 和 SQL 更新 MS ACCESS 中的表
使用 VBA (MS Access) 中的 bigint 字段更新 SQL 表