2014-11-14 38 views
0

我想比较VBA访问中的两个表,看看是否有任何需要添加到另一个中的新客户端。我开始开发比较循环,但由于某种原因,它不起作用。它表示客户ID字段对于一个表中的所有记录具有值6,这是不正确的。我不确定我是否在If声明中引用它。任何有关这个话题的帮助将不胜感激。在VBA访问中比较表

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 

UPDATE:

出于某种原因,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"") " 
+0

请问您的数据库包含一个名为* DataDump *表或查询? – HansUp 2014-11-14 20:39:12

+0

没有具体名称,但我打开它在VBA中使用该名称,所以它应该没关系? – user3681360 2014-11-14 20:41:20

+0

好的,我明白了。 * DataDump *是一个记录集对象。不,你不能'选择'一个记录集。 – HansUp 2014-11-14 20:42:40

回答

2

首先,你已经有了一个.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更有效率,除非你的表格非常小​​,然后熟练程度的差异可以忽略不计。

+0

谢谢!一个问题,我能够使用'INTO'语句将这些插入到客户表中吗?如果是这样,我会在那里放? – user3681360 2014-11-14 19:47:13

+0

取决于表是否存在。您可以使用INSERT INTO或SELECT blah blah INTO。是的,你可以很容易地将它添加到MySql,但是你需要一个DoCmd.RunQuery,因为它会将它变成一个Action Query。 – 2014-11-14 19:51:08

+0

如果表格存在,我将无法使用SELECT ..... INTO? – user3681360 2014-11-14 19:53:08

0

我同意约翰尼,查询是一个更好的选择。 Microsoft Access实际上有一个内置查询生成器来执行此操作,并且已经制作了一个可在以下链接中找到的教程。这显然不直接转化为VBA,但您可以构建查询或在您的VBA代码中使用它。

Find records without matches