【发布时间】:2013-11-15 17:20:17
【问题描述】:
我正在使用RunCommand acCmdSaveRecord 来保存记录,并且我正在尝试使用表单的BeforeUpdate 事件来验证我不想在保存记录之前留空的某些字段。
我对使用BeforeUpdate 有点陌生,所以我不确定我是否正确使用它;这是我的BeforeUpdate 代码:
Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me.[First Name]) Or IsNull(Me.LastName) Or IsNull(Me.DateOfBirth) Or IsNull(Me.CourseStartDate) Then
MsgBox "Before the enrolment can be saved, you must provide:" & vbCrLf & vbCrLf _
& "- First Name" & vbCrLf _
& "- Last Name" & vbCrLf _
& "- Date of Birth" & vbCrLf _
& "- Start Date" & vbCrLf & vbCrLf _
& "You must also attach a course. This can be done by selecting " _
& "the appropriate course in the Prospectus Search and clicking " _
& "the Use Prospectus Code button." & vbCrLf & vbCrLf _
& "If your course is not currently in the prospectus, you can " _
& "add it first by clicking the Add Course button.", vbOKOnly Or vbInformation
Cancel = True
Else
Me!EnrolmentID = "Enr" & Format(Me!ID, String(12 - Len("Enr"), "0"))
End If
End Sub
所以这基本上是测试某些字段是否留空,如果它们留空,则会显示一个消息框,显示哪些字段需要数据,然后取消更新。否则,它会分配一个自定义主键并允许更新记录。
虽然声明“无当前记录”并突出显示 RunCommand acCmdSaveRecord 代码行,但取消更新时会引发错误。
我需要做些什么来避免错误?我也试过Me.Dirty = False,但还是报同样的错误。
@Johnny Bones:
这是我根据您给我的答案尝试过的简化测试:
Public ShouldRun As Boolean
Private Sub Command7_Click()
If ShouldRun = True Then
MsgBox ShouldRun
RunCommand acCmdSaveRecord
End If
End Sub
Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me.Field1) Or IsNull(Me.Field2) Then
MsgBox "This is the true"
ShouldRun = False
Else
MsgBox "This is the false"
ShouldRun = True
End If
End Sub
基本上没有任何MsgBox 函数被触发,并且无论字段是否留空,记录都会被保存。我尝试将此作为测试,因为我的真实代码中的MsgBox 也没有在更新前事件中触发。但是不明白为什么.. 如果用户将其中一个字段留空,这应该会触发 BeforeUpdate 事件中 if 语句的真实部分,对吧?
我唯一能想到的是 RunCommand acCmdSaveRecord 没有触发 BeforeUpdate 事件,尽管 MSDN saying:
“如果您随后移动到另一条记录或保存记录,表单的更新前事件确实会发生。”
不确定这里的顺序是什么... VBA 是否运行RunCommand acCmdSaveRecord 然后是更新前事件?如果是这种情况,那么ShouldRun 变量在第一步 (RunCommand acCmdSaveRecord) 将不会有任何赋值,因为它只会在第二步 (BeforeUpdate) 得到赋值。
【问题讨论】:
-
在什么情况下调用 RunCommand acCmdSaveRecord?
-
命令按钮的 OnClick 事件。
-
如果
Before Update事件似乎没有触发,请在设计视图中打开表单并检查表单的属性页面以确保它显示[Event Procedure]表示Before Update事件. (有时 VBA 代码存在,但从表单到代码的链接不存在。) -
它在里面。我只是很困惑人们如何让这个 beforeupdate 事件为他们工作。 Johnny Bones 的回答似乎在获得赋值之前调用了一个变量(并绕过了
cancel参数)。我当前的代码使用cancel参数,但随后会触发一个错误,提示“没有当前记录”。认为这将是直截了当的! ...好旧的访问!我想要的只是检查一些字段是否为空白。如果有,那么我想显示一条用户友好的消息而不保存记录,否则保存记录。