取消BeforeUpdate时,acCmdSaveRecord上出现“No Current Record”错误

时间:2013-11-15 17:20:18

标签: ms-access access-vba

我正在使用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)获得。

2 个答案:

答案 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'。

希望有所帮助