Form.BeforeUpdate 事件 (Access)

BeforeUpdate 事件先于在控件或记录中更新已更改数据发生。

语法

表达式BeforeUpdate (取消)

expression:表示 Form 对象的变量。

参数

名称 必需/可选 数据类型 说明
Cancel 必需 Integer 确定是否发生 BeforeUpdate 事件的设置。 将 Cancel 参数设置为 True (1) 将取消 BeforeUpdate 事件。

备注

更改控件中的数据通过使用 Visual Basic 或宏中包含 SetValue 操作不会触发这些事件的控件。 但是,如果再移至其他记录或保存记录时,窗体的 更新前 事件发生。

若要在发生此事件时运行宏或事件过程,请将 BeforeUpdate 属性设置为宏的名称或设置为 [事件过程]。

该事件不适用于选项组中的选项按钮、复选框或切换按钮。 它仅适用于选项组本身。

当控件或记录发生更新时,将会触发 BeforeUpdate 事件。 在记录中,当控件失去焦点或用户按 Enter 或 Tab 时,将更新每个控件中更改的数据。当焦点离开记录时,或者如果用户单击“记录”菜单上的“保存记录”,则会更新整个记录,并且数据将保存在数据库中。

在窗体上的控件中输入新的或更改的数据,然后移动到另一条记录,或通过单击“记录”菜单上的“ 保存记录 ”来保存 该记录 时,窗体的 AfterUpdate 事件立即在控件的 AfterUpdate 事件之后发生。

移动到其他记录时,将发生控件的 ExitLostFocus 事件,然后是移动到的记录的 Current 事件,以及此记录中第一个控件的 EnterGotFocus 事件。 若要运行 AfterUpdate 宏或事件过程,而不运行 ExitLostFocus 宏或事件过程,请使用“记录”菜单上的“保存记录”命令保存记录。

只有当你在控件中更改数据时, BeforeUpdate 宏和事件过程才会运行。 当计算控件中的值发生更改时,此事件不会发生。 只有当你在记录中更改一个或多个控件的数据时,窗体的 BeforeUpdate 宏和事件过程才会运行。

对于窗体,您可以使用 更新前 事件取消移动到另一个记录之前更新记录。

如果用户在控件中键入了新值, OldValue 属性设置不会改变,等到数据被保存 (记录被更新)。 如果取消更新, OldValue 属性的值会替换控件中的现有值。

通常使用 BeforeUpdate 事件来验证数据,特别是在执行复杂验证时,如以下情况:

  • 涉及一个表单上多个值的条件。
  • 对输入的不同数据显示不同的错误消息。
  • 可以被用户重写。
  • 包含对其他表单上控件的引用或包含用户定义函数。

注意

[!注释] 进行简单的有效性验证或更为复杂的有效性验证,如需要字段中的值或验证多个窗体上的控件,可以为控件和字段和表中的记录的 有效性规则所需 属性使用 有效性规则 属性。

如果尝试修改在事件过程中触发 BeforeUpdate 事件的控件中包含的数据,则会发生运行时错误。

示例

下面的示例展示了如何使用 BeforeUpdate 事件过程,检查是否已在数据库中输入了产品名称。 当用户在 ProductName 框中键入产品名称后,此示例就会将值与“产品”表中的 ProductName 字段进行比较。 如果在“产品”表中有匹配值,则会显示消息,提醒用户此产品名称已输入。

若要尝试运行此示例,请将以下事件过程添加到“产品”表单中,其中包含“ProductName”文本框。

Private Sub ProductName_BeforeUpdate(Cancel As Integer) 
    If(Not IsNull(DLookup("[ProductName]", _ 
        "Products", "[ProductName] ='" _ 
        & Me!ProductName & "'"))) Then 
        MsgBox "Product has already been entered in the database." 
        Cancel = True 
        Me!ProductName.Undo 
    End If 
End Sub

下面的示例展示了如何在用户移到另一记录而控件在连续窗体上为空时显示消息。

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Dim oContr As Control
    For Each oContr In Me.Detail.Controls
        If IsNull(oContr) = True Then
            If MsgBox(oContr.Name & " is empty", vbOKCancel) = vbCancel Then
                Cancel = True: oContr.SetFocus: Exit Sub
            End If
        End If
    Next oContr
End Sub

下面的示例展示了如何使用表单的 BeforeUpdate 事件,要求在一个控件中输入值(如果另一个控件也有数据的话)。

Private Sub Form_BeforeUpdate(Cancel As Integer)
If (IsNull(Me.FieldOne)) Or (Me.FieldOne.Value =  "") Then
    ' No action required
Else
    If (IsNull(Me.FieldTwo)) or (Me.FieldTwo.Value = "") Then
        MsgBox "You must provide data for field 'FieldTwo', " & _
            "if a value is entered in FieldOne", _
            vbOKOnly, "Required Field"
        Me.FieldTwo.SetFocus
        Cancel = True
        Exit Sub
    End If
End If

End Sub

支持和反馈

有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。