访问VBA - 用于检查重复项的Dlookup(复合唯一键)

时间:2016-04-14 05:57:09

标签: vba ms-access access-vba

我有一个连接表,它包含2个表中的FK。这两个字段是为复合唯一键索引设置的,我需要检查DlookUp的重复项,如果可能的话。这是我试过的:

Nz(DLookup("PK_JoinTable", "JoinTable", "FK_FirstTable = " & Me.FK_FirstTable & "AND FK_SecondTable= " & Me.FK_SecondTable & _
                    " AND PK_JoinTable <> " & Nz(Me.PK_JoinTable, 0)), 0)

在这种情况下可以使用DLookUp吗?

编辑:这是我的表设计......

JoinTable

PK_JoinTable
FK_FirstTable
FK_SecondTable

这些外键表字段具有唯一索引。我有一个表单,我输入通过Combobox连接两个表的数据。我需要防止重复条目。在Before_Update事件和&#34; Save&#34;的Click事件中都有。按钮。这是我现在的整个代码(click_event of button):

Dim Duplicates As Long

Duplicates = Nz(DLookup("PK_JoinTable", "JoinTable", "FK_FirstTable = " & Me.FK_FirstTable & "AND FK_SecondTable= " & Me.FK_SecondTable & _
                        " AND PK_JoinTable <> " & Nz(Me.PK_JoinTable, 0)), 0)

 If Duplicates > 0 Then

           Cancel = True
      MsgBox "Duplicate entry. This record will not be saved !, vbCritical
      DoCmd.RunCommand acCmdUndo
      Exit Sub

      Else
           ' nothing
      End If

4 个答案:

答案 0 :(得分:1)

在您的评论中做出解释之后,是的,可以使用Dlookup执行此操作,但是您的错误很少,在AND FK_SecondTable之前错过了一个空格:

Nz(DLookup("PK_JoinTable", "JoinTable", "FK_FirstTable = " & Me.FK_FirstTable & " AND FK_SecondTable= " & Me.FK_SecondTable & _
                    " AND PK_JoinTable <> " & Nz(Me.PK_JoinTable, 0)), 0)

您也可以尝试使用与Dlookup实现相同功能的方法,但IMO更清晰,如果您的查询变得更复杂,并且更容易调试和调整,则提供更多可能性。

Dim RST As Recordset
Dim strSQL as string

strSQL = "SELECT DISTINCT(Attribute) FROM Table_Setting WHERE Attribute NOT IN (SELECT Attribute FROM Table_Setting WHERE BookType='" & strBookType & "')"

Set RST = CurrentDb.OpenRecordset(strSQL)
If  Not RST.BOF Then

    ' Looks like we have duplicates

  RST.Close
  Set RS = Nothing

  Cancel = True
  MsgBox "Duplicate entry. This record will not be saved !", vbCritical
  DoCmd.RunCommand acCmdUndo
  Exit Sub          

End If

答案 1 :(得分:1)

要调试DLookup调用,请在单独的字符串中构造WHERE部分,然后Debug.Print(Ctrl + G打开立即窗口)。

strSql = "FK_FirstTable = " & Me.FK_FirstTable & _
         "AND FK_SecondTable= " & Me.FK_SecondTable & _
         " AND PK_JoinTable <> " & Nz(Me.PK_JoinTable, 0)
Debug.Print strSql
Duplicates = Nz(DLookup("PK_JoinTable", "JoinTable", strSql), 0)

您会发现自己错过了Me.FK_FirstTableAND之间的空格。

答案 2 :(得分:0)

您应该在查询中将这些表指向一起,并在需要时对查询执行dlookup。如果您特别需要复合键,则可以在别名列下连接所需的列。

总而言之,这可能是一个更容易实现总体目标的方法,但是你的细节很短......所以我只回答了什么 提供了。

使用您更新的问题...避免重复的简单方法是根据三列创建唯一索引。

答案 3 :(得分:0)

当数据库与Dlookup一起使用时,调试会非常复杂,我建议使用哪里函数非常重要,以及尝试使用外键以及删除ur数据库中的复杂性。如果它很大那么。