【问题标题】:"No Current Record" error on acCmdSaveRecord when BeforeUpdate is cancelled取消更新前时 acCmdSaveRecord 出现“无当前记录”错误
【发布时间】: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 参数,但随后会触发一个错误,提示“没有当前记录”。认为这将是直截了当的! ...好旧的访问!我想要的只是检查一些字段是否为空白。如果有,那么我想显示一条用户友好的消息而不保存记录,否则保存记录。

标签: ms-access vba


【解决方案1】:

我会像这样设置一个全局变量:

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

通过这样做,它甚至不会尝试保存不应该保存的记录。

【讨论】:

  • 谢谢,虽然我认为这不起作用。我在我的问题中添加了代码的简化版本。此外,我已将 Global ShouldRun as Bool 更改为 Public ShouldRun as Boolean,因为 vb 无法识别前者。
  • 这里的问题是ShouldRun 将在尝试保存记录时触发的BeforeUpdate 事件过程中设置(所以在你检查它的值之后)。
【解决方案2】:

我知道已经很晚了,但你有没有试过使用DoCmd.RunCommand acCmdSaveRecord 反而?

因为对我来说它很好地触发了Before Update 事件,而RunCommand acCmdSaveRecord 没有!

但是在取消事件后你可能会得到一个执行错误'2759',因为记录不能再保存了。 所以你可以这样处理:

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”。

希望对你有帮助

【讨论】:

  • 当使用Me.Dirty = False ?
  • 不知道,我认为 3021 只是在调试期间,否则是 2501。我完全可以处理/忽略该特定错误,只要 Access 确实阻止保存记录。 :-)
猜你喜欢
  • 2012-01-21
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 2016-12-20
  • 2013-06-24
  • 1970-01-01
相关资源
最近更新 更多