Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 访问VBA-防止重复输入_Ms Access_Vba - Fatal编程技术网

Ms access 访问VBA-防止重复输入

Ms access 访问VBA-防止重复输入,ms-access,vba,Ms Access,Vba,我试图通过在更新事件之前签入条目来避免访问内置的msgbox以输入重复记录。代码可以工作,但有一个大问题——您不能再编辑这些记录了。有什么方法可以同时完成这两个任务-允许编辑和避免访问msgbox Private Sub Form_BeforeUpdate(Cancel As Integer) Dim rs As Recordset Set rs = CurrentDb.OpenRecordset("MyTable", dbOpenDynaset) If Data_Changed Then

我试图通过在更新事件之前签入条目来避免访问内置的msgbox以输入重复记录。代码可以工作,但有一个大问题——您不能再编辑这些记录了。有什么方法可以同时完成这两个任务-允许编辑和避免访问msgbox

Private Sub Form_BeforeUpdate(Cancel As Integer)

Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("MyTable", dbOpenDynaset)

If Data_Changed Then 'Variable of Boolean that is set to True in Dirty event

     If Not IsNull(ID_Field) Then

         If MsgBox("You have done changes. you wish to save? ?" & vbCrLf & vBCrLf & "Click Yes for saving changes or NO for Undoing changes ! " & _
         , vbQuestion + vbOKCancel + vbDefaultButton1) = vbOK Then

             rs.FindFirst "ID = " & Me.ID_Field

             If Not rs.NoMatch Then
                 Cancel = True
                 MsgBox "Error. You cannot add another record with same ID!", vbCritical
                 DoCmd.RunCommand acCmdUndo
                 Exit Sub
             End If


         Else

             DoCmd.RunCommand acCmdUndo

         End If

      Else

          MsgBox "Error. you cannot save record with blank ID !", vbCritical

          DoCmd.SetWarnings False
          If Me.Dirty Then Me.Undo
          DoCmd.SetWarnings True

          Exit Sub

      End If

      Me.ID_Field.Locked = True
      Me.Other_Field.Locked = True

End If

End Sub
“快照”以记录的当前状态拍摄记录,例如用于检查。它们是只读的


要以读/写方式打开记录集,请使用
dbOpenDynaset

防止内置消息,最好使用
表单.OnError
事件。
见:

例如,像这样:

Private Sub Form_Error(DataErr As Integer, Response As Integer)

    ' Error 3022 = "Cannot add a duplicate value because of a key constraint..."
    If DataErr = 3022 Then
        MsgBox "Your duplicate warning", vbExclamation
        ' Remove duplicate ID and set focus into ID control
        Me!ID_Field = Null
        Me!ID_Field.SetFocus
        ' Dont't show default error message
        Response = acDataErrContinue
    Else
        ' Other errors: show default error message
        Response = acDataErrDisplay
    End If

End Sub

假设您的主键列是
myPK

要对照当前记录以外的所有记录检查
ID\u字段
,请不要使用记录集和
FindFirst
,而是使用
DLookup

Dim TestID as Long
TestID = Nz(DLookup("ID_Field", "MyTable", "ID_Field = " & Me.ID_Field & _
                    " AND myPK <> " & Nz(Me.myPK, 0)), 0)
If TestID > 0 Then
    ' Dupe
Else
    ' ok
End If
Dim TestID尽可能长
TestID=Nz(DLookup(“ID_字段”、“MyTable”、“ID_字段=“&Me.ID_字段和_
“和myPK”&Nz(Me.myPK,0)),0)
如果TestID>0,则
“欺骗
其他的
”“好的
如果结束

您可能需要将
myPK
作为不可见文本框添加到表单中,以便能够读取其值。

我尝试过,但这并不能解决问题,记录仍然无法编辑。请在尝试编辑记录的位置显示完整的代码。Paul,我编辑记录的代码是一个简单的按钮,它以连续的形式解锁字段。谢谢。我allready以前也有过类似的情况,但仍然存在一个问题—当您仍然以连续形式在同一条记录上,并且尝试通过DoCmd.RunCommand acCmdSaveRecord保存记录时,仍然会弹出错误“3022”。这可以通过一个简单的错误句柄来解决——如果err.number=3022,那么……然而,当您试图以连续形式处理另一条记录时,表单错误代码会起作用。但是-我只想用一个代码来解决这个问题,这就是为什么我改变了一切。我明白了。您的
ID\u字段是主键吗?通常,PKs应该对用户不可见,并且用户绝对不能编辑。正如您所发现的,它会产生问题。如果是PK,用户为什么可以编辑它?如果没有,您可以使用PK标识当前记录并将其从搜索中排除。@Andre,否。ID_字段不是主键。PK对用户是不可见的,但ID和ID_字段(名称完全不同-我搞错了)的索引都设置为不重复。但是,将Id_字段更改为索引否不会改变任何内容。如果输入具有相同Id_字段的新记录,我如何从搜索中排除记录,但保持代码运行?太棒了,Andre,这很有效!!真是一场噩梦,我尝试了上千种变化,但都没有效果。非常感谢!安德烈,如果需要两个字段的组合呢?比如ID字段和其他字段?只需在Me.ID_字段后添加它?@LuckyLuke82:DLookup的第三个参数类似于WHERE子句,您可以构建任何您喜欢的条件。e、 g.
“ID\u Field=“&Me.ID\u Field&”和SomeOther\u Field=“&Me.SomeOther\u Field&”和myPK”&Nz(Me.myPK,0)
。对于文本条件,请将它们括在
'
中。我已经尝试过了,但似乎不起作用:Nz(DLookup(“ID_字段”、“JoinTable”、“ID_字段=“&Me.ID_字段和另一个_字段&u”和PK_JoinTable“&Nz(Me.PK_JoinTable,0)),0)。但是,这是一个联接表,必须检查索引为2 FK。@LuckyLuke82:在查询设计编辑器中生成查询,切换到SQL视图,并使用WHERE子句作为模板来生成DLookup参数。