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

问题描述 投票:0回答:3

这是我认为应该在 Microsoft Office Access 中工作的东西(并且我相信我曾经让它工作过)。

我有一个记录表单,其中包含一些绑定控件和一个用于保存表单上的值的按钮。

按钮的 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退出,这仍然是预期的。

问题是当执行流程返回到按钮 Click 处理程序时。

me.dirty = false
行停止执行,并抛出 运行时错误“2101”您输入的设置对此属性无效

这不是预期的,我确实相信我已经成功了。

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

ms-access
3个回答
2
投票

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

因此,在填写所有必填字段之前,“保存”按钮将被禁用。为了实现此目的,您需要在控件的 AfterUpdate 事件中测试每个所需控件的值。一般来说,你需要测试这组值,所以我倾向于编写一个函数来测试所有必需的值,如果所有值都填写则返回 TRUE,然后在所有必需控件的 AfterUpdate 事件中使用它:

  Private Sub txtLastName_AfterUpdate()
    Me!btnSave.Enabled = CheckRequiredFields()
  End Sub

现在,为了使这对您来说更容易,您可以更改 CheckRequiredFields,使其不仅仅是一个函数,而是设置“保存”按钮的“Enabled”属性,然后您只需将“=CheckRequiredFields”粘贴到所有字段的 AfterUpdate 属性中即可控件(这假设您不需要在 AfterUpdate 事件中执行任何其他操作)。

我一直对对话框表单执行此操作,默认情况下禁用“确定”按钮,仅启用“取消”按钮。然后,我测试是否已使用上述方法填写了所有字段。因此,在正确输入所有内容之前,用户无法执行该操作。在我看来,这比捕获“保存”按钮中丢失的数据更好——也就是说,在记录完成之前不要让用户尝试保存。


1
投票

鉴于 Access 默认保存记录,您此时是否需要保存记录?如果是这样,也许捕获错误会适合:

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

0
投票

cancel = true
替换为
me.undo

private sub form_beforeupdate(cancel as integer)

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

  ' ...  more checks ...

end sub
© www.soinside.com 2019 - 2024. All rights reserved.