我在主窗体(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都很缺乏经验。
谢谢
答案 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。