删除表单记录源中的记录而不触发表单的当前事件

Deleting a record in form's recordsource without then triggering the form's current event

我正在使用表单的当前事件从其 OpenArgs 属性 中提取数据,以便为当前记录预填充一些空字段。

当前事件 VBA 如下图所示(是 pullData 子将此新数据引入当前记录):

Private Sub Form_Current()

    If _
        SplitOpenArg(6) = "NewAssessment" _
    Then        
        pullData
        EditMode
    Else
        ViewMode
    End If

End Sub

在表单的其他地方,我有一个命令按钮,该按钮分支到一个选项,供用户 delete/discard 显示在表单上的当前记录:

Dim db As DAO.Database
Dim sql As String

Set db = CurrentDb    
sql = "DELETE * FROM myTable WHERE ID='" & Me.ID & "'"    
db.Execute sql

Set db = Nothing

DoCmd.Close acForm, "myForm"

当以这种方式删除记录时,似乎触发了表单的 Current 事件...我想这是设计使然;如果当前记录已被删除,访问将转移到另一条记录。

对我来说不幸的是,这意味着 pullData 子再次 运行,因此部分重新创建了用户试图删除的记录。

我试过 DoCmd.RunCommand acCmdDeleteRecord,但那会导致同样的问题。

是否可以从表单的记录源中删除记录而不触发表单的当前事件?

我可能会关闭表单并删除与表单分开的模块中的记录,但如果这可以从表单模块本身实现,我会很感兴趣。

我认为您无法使用这种方法 - 删除绑定表单中的当前记录将触发移动到另一条记录并触发 Current 事件。

设置您的表单,以便绑定 none 个字段。加载表单时,从数据库中获取数据并填充字段。如果用户随后决定删除这条记录,您就可以控制删除它并根据需要加载另一条记录。

您可以将删除代码移到窗体的 Unload 事件中,只将关闭命令留给您的按钮。

[1] 为表单创建一个私有布尔变量。

Option Compare Database
Option Explicit
Dim bUserDeleted As Boolean 'put this in the form's main code

默认值已设置为 false,但如果您愿意,可以在 OnLoad() 事件中将 var 设置为 false

[2] 在删除命令按钮代码中的记录之前将变量设置为 True。

Dim db As DAO.Database
Dim sql As String

bUserDeleted = True 'set it to true so oncurrent and/or on unload can check it

Set db = CurrentDb    
sql = "DELETE * FROM myTable WHERE ID='" & Me.ID & "'"    
db.Execute sql

Set db = Nothing

DoCmd.Close acForm, "myForm"

[3] 如果bUserDeleted 为True 则跳出或Sub(s)

Private Sub Form_Current()

   if bUserDeleted = True then exit Sub 'add this to jump out cleanly

    If _
        SplitOpenArg(6) = "NewAssessment" _
    Then        
        pullData
        EditMode
    Else
        ViewMode
    End If

End Sub