访问VBA - 检测重复的记录

时间:2013-07-02 15:54:17

标签: ms-access access-vba ms-access-2003

我有一个VBA程序(在表格后面)执行以下操作; -

  • 将数据从XML文件导入到空的临时表(带有一个名为ID的关键字段)
  • 根据临时表
  • 中的查询创建电子表格
  • 通过追加查询将数据附加到备份表中(备份表具有与临时表相同的表格格式,即名为ID的关键字段)
  • 从准备好下一次运行的临时删除所有内容

从XML导入数据后,我希望能够捕获同一文件尝试导入两次的场景(即临时表包含备份表中也存在的ID),告诉用户通过msgbox,然后退出Sub。

我原本以为可以通过错误代码处理来尝试追加,捕获有关重复键的错误。

我有一个附加查询要附加到备份,如果我通过查询本身运行此查询,我会收到有关重复项的警告等,并可选择继续运行查询。

但是,我是通过OpenQuery在VBA中执行此操作(并且已关闭警告),所以没有任何反应?我似乎无法捕获错误代码。

我尝试编写一个select查询以识别任何重复的ID,然后以某种方式检测该查询是否返回任何行,但也无法使其工作,因为无法找到检测查询是否返回任何行的方法。

1 个答案:

答案 0 :(得分:0)

“我是通过OpenQuery在VBA中执行此操作(并且已关闭警告),所以没有任何反应?我似乎无法捕获错误代码。”

关闭SetWarnings会抑制一般信息,因此这就是您未出现预期错误消息的原因。许多有经验的Access开发人员建议关闭SetWarnings是一个坏主意。有关SetWarnings关闭后排除故障的详细信息,请参阅this SO question

由于您有“追加查询”,请使用DAO.Database .Execute方法执行该操作,而不是使用OpenQuery

Dim db As DAO.Database
Dim strInsert As String
strInsert = "INSERT INTO backup_table(ID, fld1, fld2)" & vbCrLf & _
    "SELECT ID, fld1, fld2 FROM temp_table"
Set db = CurrentDb
db.Execute strInsert, dbFailOnError

SetWarnings开启(True)时,如果备份表已包含您要添加的ID值,则该方法会因密钥违规而触发错误消息。

另外,如果你想要重复的计数,这个查询应该给你。

SELECT Count(*) AS count_of_duplicates
FROM
    temp_table AS t
    INNER JOIN backup_table AS b
    ON t.ID = b.ID

如果您想在temp_table中插入不重复的backup_table行,请尝试这样的查询......

INSERT INTO backup_table(ID, fld1, fld2)
SELECT t.ID, t.fld1, t.fld2
FROM
    temp_table AS t
    LEFT JOIN backup_table AS b
    ON t.ID = b.ID
WHERE b.ID Is Null