我正在使用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事件中触发。看不清楚为什么..如果用户将其中一个字段留空,这应该触发BeforeUpdate事件中if语句的真实部分,对吗?
我唯一能想到的是RunCommand acCmdSaveRecord
没有触发BeforeUpdate事件,尽管MSDN saying:
“如果您转移到另一条记录或保存记录,表单的BeforeUpdate事件确实会发生。”
不确定这里的订单是什么... VBA运行RunCommand acCmdSaveRecord
然后运行BeforeUpdate事件?如果是这种情况,那么ShouldRun
变量在第一步(RunCommand acCmdSaveRecord
)将没有任何赋值,因为它只在第二步(BeforeUpdate)获得。
答案 0 :(得分:0)
我会像这样设置一个全局变量:
Global ShouldRun as Bool
你把它放在代码页的最顶层,在你声明Options Explicit的地方。然后,在上面提供的If / Then / Else语句中,替换以下行:
Cancel = True
带
ShouldRun = False
并在Else部分添加行
ShouldRun = True
最后,您的命令按钮的OnClick事件看起来应该更像这样:
If ShouldRun = True then
RunCommand acCmdSaveRecord
End If
通过这样做,如果不这样做,它甚至都不会尝试保存记录。
答案 1 :(得分:0)
我知道它已经很晚了,但你试过使用DoCmd.RunCommand acCmdSaveRecord
吗?
代替?
因为对我来说,当Before Update
没有出现时,RunCommand acCmdSaveRecord
事件就好了!
但取消事件后,您可能会收到执行错误'  ,因为该记录无法再保存。 所以你可以这样处理它:
Private Sub Command7_Click()
On Error GoTo Command7_Click_Error
DoCmd.RunCommand acCmdSaveRecord
Command7_Click_Exit:
Exit Sub
Command7_Click_Error:
If Err.Number=2759 Then
'ignore the error
Else
MsgBox Err.Description
End If
Resume Exit_Here
End Sub
如果您使用的是Me.Dirty = False
,则可以处理错误' 2101'。
希望有所帮助