在使用VBA的Access中捕获表单时出错

时间:2019-01-30 23:27:30

标签: vba ms-access

所以我有一个正在更新Microsoft Access中的表的表单。如果尚未填写“名字”,我正在使用BeforeUpdate事件调用来阻止表单更新。

我基本上只希望在填写完所有内容后保存表单,然后切换到查看更新的表(如果不取消的话,该位)。

当前弹出框提示“您必须输入名字”正确触发,下一个弹出框询问用户是否要撤消任何更改。但是随后会出现一个弹出框,显示“无当前记录”,然后视图变为表格。我不确定为什么会这样。

Option Compare Database

Private Sub Form_BeforeUpdate(Cancel As Integer)

   Cancel = False

' perform data validation
If IsNull(Me.customer_f_name) Then

   MsgBox "You must enter a First Name.", vbCritical, "Data entry error..."
   Me.customer_f_name.BorderColor = vbRed
   DoCmd.GoToControl "customer_f_name"

   Cancel = True

End If

If Not Cancel Then

    DoCmd.SelectObject acTable, "ticket_tracker_table"
    DoCmd.Requery
    DoCmd.GoToRecord acDataTable, "ticket_tracker_table", acLast

End If

' if the save has been canceled or did not pass the validation , then ask to Undo changes
If Cancel Then

    If MsgBox("Do you want to undo any changes?", vbYesNo, "Confirm") = vbYes Then
        Me.Undo
    End If

End If

End Sub

2 个答案:

答案 0 :(得分:0)

查看https://docs.microsoft.com/en-us/office/vba/api/Access.Form.BeforeUpdate(even)

使用SetFocus代替GoToControl。 我对“撤消”问题做了一个非常简单的测试,它确实有效:

Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me.customer_f_name) Then
    MsgBox "Must enter customer name."
    Cancel = True
    If MsgBox("Do you want to undo edits?", vbYesNo) = vbYes Then Me.Undo
    Me.customer_f_name.SetFocus
End If
End Sub

建议您将表代码放入AfterUpdate事件中。

答案 1 :(得分:0)

因此用一些大图来补充J7:“基本上只希望在所有内容都填写后保存表单”。逆着潮流游泳;这就是为什么您必须编写大量代码的原因。产品从根本上输入数据。那是它的核心设计。

在进行过程中进行字段检查是非常正常的-通常在AfterUpdate事件中,将应用检查代码,如果无效,则生成一个消息框并调用“撤消”,并将焦点重新设置为他们尝试的字段离开。

完全不同的设计,在某些情况下,它可能仅出于保存表单输入数据的目的而证明临时的本地重复表是正确的-这种方法可以对生产数据库中的数据进行非常精细的检查;如果有效,追加查询将把数据写入永久表中。