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

时间:2009-12-01 13:38:18

标签: ms-access

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,因此取消设置为true并退出子,这仍然是预期的。

问题是当执行流程返回按钮Click handler时。第me.dirty = false行停止执行,运行时错误'2101'您输入的设置对此属性无效

这不是预期的,我确实相信我有这个工作。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分: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