在VBA Access中标识3列PK副本

时间:2015-05-12 13:07:32

标签: sql vba ms-access

我似乎无法找出确定我的记录表是否已使用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

我之所以不希望将自动ID递增为col0是因为我必须检查col1,col2和col3中的值,以确定是应该添加新数据还是仅仅重新添加-calculated。

2 个答案:

答案 0 :(得分:0)

您可以使用一个查询执行此操作:

  

使用一个查询更新和附加记录

     

作者:Alan Biggs

     

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

     

请按照以下步骤操作:

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

  2.   
  3. 双击关系并选择包含来自tblNew的所有记录的连接选项以及仅包含来自tblNew的记录的连接选项   tblOld。

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

  6.   
  7. 对于每个字段,在tblNew.FieldName中的“更新到”单元格类型中,其中FieldName与tblOld的字段名称匹配。

  8.   
  9. 从“视图”菜单中选择“查询属性”,并将“唯一记录”更改为“假”。 (这会关闭SQL中的DISTINCTROW选项   视图。如果你留下这个,你将只获得一个空白记录   结果,但您希望添加每个新记录的一个空白记录   to tblOld。)

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

  12.         

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

答案 1 :(得分:0)

我找到了两种处理此问题的一般方法。 (1)将包括错误处理 - 我发现这是一种不好的做法。 (2)将包括DCount函数以首先查找数据行,然后使用if条件来确定是否应使用UPDATEINSERT

因此我使用(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