如何确定正在删除哪些记录?

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启用

【讨论】:

以上是关于如何确定正在删除哪些记录?的主要内容,如果未能解决你的问题,请参考以下文章

我如何确定backbone.js方法接受哪些选项?

如何记录哪些用户删除了 MS Access 中的记录?

如何记录哪个用户在 mongoDB 数据库中发布了哪些记录

如何给burpsuite添加插件

确定 Access 1997 报告用于生成哪些查询?

如何确定Oracle数据库表中重复的记录