Ms access D重复项的计算不允许用户在意外编辑旧字段时保留该字段

Ms access D重复项的计算不允许用户在意外编辑旧字段时保留该字段,ms-access,vba,dcount,Ms Access,Vba,Dcount,在我的字段上的BeforeUpdate事件中,我设置了一个dcount,以禁止字段SurveyID中的重复项。这非常有效,除非在过去的记录中,用户意外地开始编辑其SurveyID,并尝试取消意外地选择SurveyID字段,开始键入,然后删除它并输入SurveyID。它将SurveyID视为一个副本,即使它不是真的并且不允许他们保留ID。我已经做了一半的工作,在这之后重置SurveyID,所以如果他们在上面的场景中,他们至少可以保留他们的ID。我真正想知道的是,我的代码是否有办法防止这种情况发生。

在我的字段上的BeforeUpdate事件中,我设置了一个dcount,以禁止字段SurveyID中的重复项。这非常有效,除非在过去的记录中,用户意外地开始编辑其SurveyID,并尝试取消意外地选择SurveyID字段,开始键入,然后删除它并输入SurveyID。它将SurveyID视为一个副本,即使它不是真的并且不允许他们保留ID。我已经做了一半的工作,在这之后重置SurveyID,所以如果他们在上面的场景中,他们至少可以保留他们的ID。我真正想知道的是,我的代码是否有办法防止这种情况发生。SurveyId不是主键,因为他们可以使用两种不同的ID代码。也许有一个额外的逻辑,如果表单中记录中的主键与副本aka本身的主键匹配,那么它不会在副本中被处理

这是我目前的代码

Private Sub SurveyID_BeforeUpdate(Cancel As Integer)
'checks for duplicates'
If DCount("SurveyID", "test", "SurveyID=" & Nz(Me.SurveyID, 0)) > 0 Then
    Beep
    MsgBox "The Survey ID number you have entered is a duplicate. Please double check that the number you entered is correct. If it is correct, please X."
    Me.SurveyID.Undo
    Cancel = True
End If
End Sub

这就是为什么绑定表单是个坏主意。永远不要把表格绑在桌子上。撤消条目充其量是不可靠的,而绑定表单的工作方式是,只要更改字段,记录就会写入表中。是的,有一个撤销命令,但它不可靠


从表单中解除表的绑定,并编写代码,更新记录(如果记录已存在),或在按下提交按钮时写入新记录。这需要更多的编码,需要更好地理解访问,但这是正确的方法。

您是否尝试过将SurveyID设置为索引为是非重复项?只要Required也设置为No,它就不允许您输入重复的值,但如果您愿意,也可以将其保留为空

您应该仍然能够在表单的On error事件中捕获错误,以便显示友好消息