删除表单记录源中的记录而不触发表单的当前事件
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
我正在使用表单的当前事件从其 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