Ms access MS Access-输入前检查子表单是否存在重复项

Ms access MS Access-输入前检查子表单是否存在重复项,ms-access,duplicates,Ms Access,Duplicates,我在主窗体(CustomerAnswers)中有一个子窗体(CustomerAnswerSSUB)。当有人输入一个新的CustomerSwersSub条目时,我希望它首先检查重复项 它必须检查4个不同的字段才能首先匹配 这就是我到目前为止得到的 Private Sub Form_BeforeUpdate(Cancel As Integer) Dim rsGlobals As ADODB.Recordset Dim sql Set rsGlobals = New ADODB

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

它必须检查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已经存在的框

任何想法,我是相当没有经验,当谈到访问VB


谢谢你

它什么都不做-只是坐在那里

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

我看你的更新前程序没有任何问题。我仍然会使用DCount()函数来转换它,而不是打开ADO记录集。(请参阅Access的“帮助主题以了解数据帐户”)

假设表的subscriptionNo、journal、volume和issue字段都是数字数据类型。如果其中任何一个是文本类型,则需要在strCriteria中用引号括起这些值

我添加了Debug.Print strCriteria,这样您就可以在即时窗口中查看完整的字符串表达式。您还可以通过复制已完成的字符串并将其粘贴到新查询的SQL视图中作为WHERE子句来对其进行故障排除

也可以考虑在订阅号、日志、卷和发布到Cuffer-RealSerd表设计上添加唯一索引。这样,您就可以强制实现唯一性,而不必完全依赖于您的表单。使用DCount函数或原始记录集SELECT语句,索引还可以提高性能


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

oh heck。是的,有几个字段是文本而不是数字。哎呀。谢谢你的关注,我很感激。
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