代码之家  ›  专栏  ›  技术社区  ›  René Nyffenegger

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

  •  1
  • René Nyffenegger  · 技术社区  · 15 年前

    这是我认为应该发挥作用的东西(我相信我曾经让它发挥作用)。 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,这仍然是预期的。

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

    这是意料之中的事,我相信我确实做到了。

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

    2 回复  |  直到 15 年前
        1
  •  1
  •   Fionnuala    15 年前

    此时是否需要保存记录,因为保存是访问的默认值?如果是这样,可能会捕获错误:

    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
    
        2
  •  2
  •   David-W-Fenton    15 年前

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

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

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

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

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