Ms access 当我有一个按钮在表单上保存记录时,如何防止Access中出现错误2101?

Ms access 当我有一个按钮在表单上保存记录时,如何防止Access中出现错误2101?,ms-access,Ms Access,这里有一些我认为应该有用的东西(我相信我曾经用过) 我有一个单记录表单,有几个绑定控件和一个按钮来保存表单上的值 按钮的OnClick处理程序基本上是一个 private sub btnSave_Click() me.dirty = false end sub 因为我需要检查输入的值,所以还有一个OnBeforeUpdate处理程序: private sub form_beforeupdate(cancel as integer) if nz(me.SomeControl, "

这里有一些我认为应该有用的东西(我相信我曾经用过)

我有一个单记录表单,有几个绑定控件和一个按钮来保存表单上的值

按钮的OnClick处理程序基本上是一个

private sub btnSave_Click()
     me.dirty = false
end sub
因为我需要检查输入的值,所以还有一个OnBeforeUpdate处理程序:

private sub form_beforeupdate(cancel as integer)

  if nz(me.SomeControl, "") = "" then
     msgBox("....")
     cancel = true
     exit sub
  end if

  ' ...  more checks ...

end sub
现在,当我单击按钮,处理程序到达me.dirty=false时,执行流将转到BeforeUpdate处理程序,这是预期的。由于ComeControl未填充,因此cancel被设置为true,并且sub退出,这仍然是预期的

问题是当执行流返回到按钮单击处理程序时。行
me.dirty=false
停止执行,并引发运行时错误“2101”。您输入的设置对此属性无效

这是意料之外的,我确实相信我已经成功了


无论如何,如何将这样一个保存按钮与BeforeUpdate处理程序一起使用?

如果保存是默认的访问方式,那么此时是否需要保存记录?如果是这样,也许捕捉错误将适合:

Private Sub btnSave_Click()
On Error GoTo Err_Handler

 Me.Dirty = False

Exit_Here:
     Exit Sub

Err_Handler:
     If Err.Number=2101 Then
       'ignore or message
     Else
        MsgBox Err.Description
     End If

     Resume Exit_Here
End Sub

你设计界面的方式我认为是错误的。在填写完所有数据之前,我不会让用户单击保存按钮

因此,“保存”按钮将被禁用,直到填写完所有必填字段为止。为了实现这一点,您需要在控件的AfterUpdate事件中测试每个所需控件的值。通常,您需要测试一组值,因此我倾向于编写一个函数来测试所有必需的值,如果所有值都已填写,则返回TRUE,然后在所有必需控件的AfterUpdate事件中使用该函数:

  Private Sub txtLastName_AfterUpdate()
    Me!btnSave.Enabled = CheckRequiredFields()
  End Sub
现在,为了让自己更轻松,您可以更改CheckRequiredFields,使其不仅仅是一个函数,而是设置Save按钮的Enabled属性,然后您可以将“=CheckRequiredFields”粘贴到所有控件的AfterUpdate属性中(这假设您不需要在AfterUpdate事件中执行任何其他操作)


对于对话框窗体,我总是这样做,默认情况下禁用OK按钮,而只启用Cancel按钮。然后,我测试是否已使用上述方法填写了所有字段。因此,在正确输入所有内容之前,用户无法执行操作。在我看来,这似乎比在“保存”按钮中捕获丢失的数据更可取——也就是说,在记录完成之前,不要让用户尝试保存。

使用错误处理程序可能是“解决方法”。在某种程度上,我明白如果记录无法保存,它不会让我将dirty设置为false。再说一次,它和其他很多东西一样笨拙,无法进入。至于默认的保存方式:这不适合我,我显然需要一个按钮来保存记录。无论如何,非常感谢你回答我的问题