如何确定正在删除哪些记录?
Posted
技术标签:
【中文标题】如何确定正在删除哪些记录?【英文标题】:How to determine which records are being deleted? 【发布时间】:2019-04-06 16:12:34 【问题描述】:已编辑 - 正如 Leif 所问的 here: 当用户从表单中的数据表视图中删除多条记录时,我希望能够在 VBA 事件例程中确定哪些记录被删除。我需要这些信息来删除文件服务器上的一些关联文件。如果只删除一条记录,我没有问题,因为它将是当前记录。但是,如果要删除多条记录怎么办?这个列表在 VBA 事件过程中的某处可用吗?
Form_Delete
事件的问题在于它在 MS Access 尝试 删除选定行时被触发,如果由于某些原因(关系等)而失败,则它会弹出错误消息和/或确认对话框。如果用户按下取消,则删除的记录“神奇地”回来。我没有找到方法来追踪实际删除的内容和未删除的内容。
Form_AfterDelConfirm
确认后运行一次,无法访问已删除的记录集合
我只需要一组真正删除的记录 ID。
【问题讨论】:
还有一个 BeforeDeleteConfirm 事件。 @CPerkins 我已经完全重写了我的问题,因为它有点令人困惑。我希望现在好些了。 你不能使用带有点击事件的自定义按钮来删除吗?然后,您可以遍历选定的记录并保留 ID @SiyonDP - 这很复杂,请参阅***.com/questions/1669946/…。另外,我不想为内置的东西开发自己的代码。也许我只是错过了一些东西 @Combinatix 你没有遗漏任何东西。 Access 数据模型通常具有不完整的方法和事件。必须执行愚蠢的杂耍行为来捕获并在界面中选择的行上执行操作。顺便说一句,MS docs 指出 AfterDelConfirm 可以在访问选项中被抑制。因此,通过设置 UI 选项,它可能会阻碍开发人员正确处理数据事件的能力! 【参考方案1】:将所有可能删除的记录存储在一个集合中,然后与表单的记录集进行比较:
Private PossiblyDeleted as New Collection 'Module level collection
Private Sub Form_Delete(Cancel As Integer)
'If collection doesn't exist it is created
PossiblyDeleted.Add Str(Me!ID) 'Store every ID
End Sub
Private Sub Form_AfterDelConfirm(Status As Integer)
If Status = 0 Then 'If Yes pressed
Dim RecID As Variant
Dim RS As Recordset
Set RS = Me.Recordset.Clone
For Each RecID In PossiblyDeleted 'loop through collection
RS.FindFirst ("ID = " & RecID)
If RS.NoMatch Then 'and see what was deleted
'Perform the action here
Debug.Print RecID
End If
Next
End If
Set PossiblyDeleted = Nothing 'Delete collection
Set RS = Nothing
End Sub
正如上面提到的 C Perkins - 当用户禁用确认时,这可能不起作用。我猜它可以通过DoCmd.SetWarnings True
启用
【讨论】:
以上是关于如何确定正在删除哪些记录?的主要内容,如果未能解决你的问题,请参考以下文章