MS Access - 在输入之前检查子表单是否重复

时间:2010-10-24 13:24:31

标签: ms-access duplicates

我在主窗体(customersAnswers)中有一个子窗体(customersAnswersSub)。当有人输入新的customerAnswersSub条目时 - 我希望它首先检查重复项。

必须检查4个不同的字段才能匹配。

这是我到目前为止所做的。

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Dim rsGlobals As ADODB.Recordset
    Dim sql
    Set rsGlobals = New ADODB.Recordset
    sql = "Select * From CustomerAnswerD where subscriptionNo=" & _
        Me.subscriptionNo & " AND journal=" & Me.Journal & _
        " AND volume=" & Me.volume & " AND issue=" & Me.issue
    rsGlobals.Open sql, CurrentProject.Connection, adOpenDynamic, adLockOptimistic, adCmdText
    If Not rsGlobals.BOF And Not rsGlobals.EOF Then
        MsgBox ("Already entered")
        Cancel = True
        Me.Undo
    End If
End Sub

它没有做任何事情 - 只是坐在那里。当我关闭表单时,它会弹出一个-id已存在的框。

任何想法,我对Access VB都很缺乏经验。

谢谢

1 个答案:

答案 0 :(得分:1)

它没有做任何事情 - 只是坐在那里

只是检查,因为你说你对Access缺乏经验......在尝试记录保存之前,不会触发表单更新事件。一旦用户将数据输入所有字段,这可能不会自动发生。但是,您可以通过导航到子窗体中的其他记录来触发更新,或者通过选择记录 - >从Access中保存记录(2003)主菜单等方法来触发更新。

我没有看到您的BeforeUpdate程序有任何问题。我仍然会使用DCount()函数转换它而不是打开ADO记录集。 (请参阅访问'DCount的帮助主题)

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Dim strCriteria As String
    strCriteria = "subscriptionNo=" & Me.subscriptionNo & " AND journal=" & Me.Journal & _
        " AND volume=" & Me.volume & " AND issue=" & Me.issue
    Debug.Print strCriteria
    If Dcount("subscriptionNo", "CustomerAnswerD", strCriteria) > 0 Then
        MsgBox ("Already entered")
        Cancel = True
        Me.Undo
    End If
End Sub

假设您的表的subscriptionNo,journal,volume和issue字段都是数字数据类型。如果它们中的任何一个是文本类型,则需要将值括在strCriteria中的引号中。

我添加了 Debug.Print strCriteria ,因此您可以在立即窗口中查看已完成的字符串表达式。您还可以通过复制并将其作为WHERE子句粘贴到新查询的SQL视图中来解决该已完成的字符串。

另外,请考虑在subscriptionAo,journal,volume和issue上添加唯一索引到CustomerAnswerD表设计。这样,您可以强制执行唯一性,而无需仅依靠您的表单来执行此操作。该索引还可以使用DCount函数或原始记录集SELECT语句提供更快的性能。

如果保留原始记录集方法,请关闭记录集并在退出过程之前设置对象变量= Nothing。