【问题标题】:Identify a 3-column PK duplicate in VBA Access在 VBA Access 中识别 3 列 PK 重复项
【发布时间】:2015-05-12 13:07:31
【问题描述】:

我似乎无法找出使用 VBA 来识别我的记录表是否已经具有唯一的 3 列数据组合的最佳方法。

我的表如下:

CREATE TABLE sometable(
col1 NUMERIC,
col2 NUMERIC,
col3 NUMERIC,
col4 NUMERIC,
Primary Key(col1, col2, col3)
);

现在在我的表单中,我正在向表中添加值(即,用户填写 3 个字段,单击 add 按钮并将其插入到表中)。

如果数据行已经存在,按下add 按钮不会执行任何操作。

我想要实现的是检查(使用 VBA)这样的行是否已经存在(基于 col1 和 col2 和 col3 的唯一性)将已有记录的 col4 与新添加相加。

例如,如果我已经存在的数据是这样的:

col1 col2 col3 col4
1    2    3    10
1    3    3    20

并且用户想要添加:

1 1 1 10

它只会在表格中添加一个新行。 但是,如果他想添加:

1 2 3 10

这将导致表格:

col1 col2 col3 col4
1    2    3    20 'added up col4 here
1    3    3    20
1    1    1    10

我不想让 Auto-ID 递增为 col0 的原因是因为我必须检查 col1、col2 和 col3 中的值以确定是应该添加新数据还是简单地重新计算.

【问题讨论】:

  • 在企业数据库中,这称为MERGE,或Upserting。在 mySQL 中是on duplicate key update。我无法在 msAccess 中找到等价物。我所能想到的就是将其编码为插入,捕获重复键错误,然后将其应用为更新语句。 (反之亦然代码更新时找不到记录然后插入)
  • 如何捕获重复键错误?目前,当我插入已经存在的新数据行时,我没有收到任何错误 - 它什么也不做(没有错误)。
  • "什么都不做......包括不插入新行?"连接对象应该有一个错误方法,您应该在更新后检查它。 stackoverflow.com/questions/5389634/… 是一些错误处理的示例

标签: sql vba ms-access


【解决方案1】:

你可以用一个查询来做到这一点:

一次查询更新和追加记录

艾伦·比格斯

您知道吗?您可以在 Access 中使用更新查询来访问两者 同时更新和添加记录?这很有用,如果你有 表的两个版本,tblOld 和 tblNew,并且您想要集成 从 tblNew 到 tblOld 的变化。

按照以下步骤操作:

  1. 创建更新查询并添加两个表。通过将 tblNew 的键字段拖到 tblOld 的匹配字段上来连接两个表。

  2. 双击关系并选择包含来自 tblNew 的所有记录以及仅与 tbl旧的。

  3. 从 tblOld 中选择所有字段并将它们拖到 QBE 网格上。

  4. 对于每个字段,在更新到单元格中输入 tblNew.FieldName,其中 FieldName 与 tblOld 的字段名称匹配。

  5. 从视图菜单中选择查询属性并将唯一记录更改为 False。 (这会关闭 SQL 中的 DISTINCTROW 选项 看法。如果你留下这个,你只会在你的 结果,但您希望为每个要添加的新记录添加一个空白记录 到 tblOld。)

  6. 运行查询,您将看到对 tblNew 的更改现在位于 tblOld 中。

这只会将已添加到 tblNew 的记录添加到 tblOld。 tblOld 中不存在于 tblNew 中的记录仍将保留在 tblOld。

【讨论】:

    【解决方案2】:

    我发现了 2 种处理此问题的一般方法。 (1) 将包括错误处理——我认为这是一种不好的做法。 (2) 将包含 DCount 函数首先查找数据行,然后包含一个 if 条件来确定应该使用UPDATE 还是INSERT

    因此我使用(2)如下:

    If DCount("*", "sometable", "[col1]= " & Me.col1.value & " AND [col2] = " & Me.col2.value & " AND [col3] = " & Me.col3.value) = 0 Then
        CurrentDB.Execute "INSERT ..."
    Else
        CurrentDB.Execute "UPDATE ..."
    End If
    

    (1) 解决方案类似于:

    On Error Resume Next
    CurrentDb.Execute "INSERT ...", dbFailOnError
    If Err.Number = 3022 Then
        Err.Clear        
        CurrentDb.Execute "UPDATE ...", dbFailOnError
    End If
    

    【讨论】:

      猜你喜欢
      • 2011-11-16
      • 1970-01-01
      • 2019-11-28
      • 2021-01-03
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      相关资源
      最近更新 更多