ms-access - 检测是否在 Access 绑定(bind)表上删除了当前记录

标签 ms-access vba

如果用户#1删除了Access 2007数据库(SQL Server ODBC链接表)中的一条记录,则其他用户可能会在该记录中显示“已删除#”(在“数据表视图”表单上)。在某些情况下,这可能会引起问题,因为我拥有在窗体的当前事件上运行的代码,并且仅假设存在有效记录(或新记录)。

有什么可靠的方法来检测当前记录是否已删除?我想将其包装在这样的函数中:

Public Function IsRecordDeleted(ByRef r As DAO.Recordset)
   'what goes here?
End Function


我确实在MSDN的DAO参考中找到了RecordStatus属性,但是该属性仅在RecordSet配置为批量更新时才有效。当我尝试检查它的值时,我得到:运行时错误3251-这种类型的对象不支持操作。

我实际上在一两年前在另一个论坛上发布了关于此相同问题的信息。给出的建议不起作用:


DCount()
记录集的书签和不匹配
检查PK或FK字段中的#Deleted

最佳答案

对我来说,这看起来更像是一般的应用程序设计监督,而不是具有简单变通办法的简单问题。

如果您对重要位置的记录可用性进行了假设,则必须考虑将记录删除作为数据的主要(有效)状态的可能性。

有可能-但我认为不太可能-您会找到一种解决方法,但我认为您应该仔细查看整体设计本身。

解决该问题的一些方法可能对您有用,也可能不起作用,具体取决于用户如何包含和访问您的数据:


如果您不能确定记录是否存在,那就根本不要依赖记录的存在。
基本上,重新设计假设并修改现有代码,以避免依赖于记录的强制性存在。
责任分工
不允许不同的用户对相同的数据具有相同的创建/编辑/删除权限。例如,采购订单应属于创建它的用户。不允许其他用户单独删除该订单或其项目。
实际上并没有删除实体,只是允许用户将其标记为“已取消”或“已过时”,并出于历史原因将其保存在数据库中(或稍后清除它们)。
或者,实际上不删除记录,而是在用户想要删除记录时添加一个隐藏的布尔字段以将它们标记为“已删除”。然后,您可以每天晚上进行一些清理,并实际上删除已标记的记录。
当然,您将不得不从查询和表单等中排除这些“已删除”的记录,但是将保留数据完整性。
将报告和记录列表设为只读,这样用户就不能随便删除它们。例如,如果用户可以查看“采购订单”项目,则除非他们实际打开“采购订单明细”表格,否则不允许他们删除该数据。
在本地缓存记录,以便如果它们从后端数据库中消失,它们仍将显示给查看它们的用户,直到刷新列表为止。
这对于只读报告通常很有用:将查询结果加载到本地表中,然后使用实时数据绑定该表而不是查询。
正在查看的数据可能有点陈旧,因为它不会实时更新(因为它已本地缓存),但对于报表来说,通常没问题(只需在表单上提供“刷新”按钮即可允许用户强制刷新) 。
尝试使用各种锁定选项(请参见database optionsform record locking)以禁止删除记录(如果有人正在访问它们)。
管理您自己的锁定方案。
作为最后的选择,您可以在'LockingStatus'表中记录ID,并记录其他人当前正在查看或编辑的ID。例如:

Table: LockStatus
Field: LockNature:   Whether the record is being Edited or Viewed
Field: LockedTable:  Name of the table of the record being locked
Field: LockedRecord: ID of the record being locked
Field: User:         Name of the user holding the lock
Field: LockTime:     DateTime of the lock creation, so you can detect 
                     and remove stale locks


当用户查看或编辑记录时,首先检查表中是否存在该记录的条目。如果存在,请告诉用户他们无法执行该操作,因为其他人正在查看数据。如果没有现有条目,则添加一个条目,允许进行编辑,并在编辑完成后删除记录。
这充满了复杂性,因为您需要跟踪用户何时移动到另一条记录,以便可以解锁上一条记录,并且如果不小心,可能会得到很多陈旧的锁,但是之前已经完成了。
如果您仍然真的想避开已删除记录的问题,请查看从另一个位置删除记录时,在VBA代码中的错误3167“记录已删除”发生的位置。
一旦知道了它在代码中的位置,就可以使用On Error 3167 Goto YourErrHandler捕获该错误,以优雅地处理该特定错误(这实际上取决于表单的设计方式和数据使用方式)。
另一种选择是使用全局错误处理程序进行访问。
我只知道vbWatchdog。它不是免费的,但效果非常好,并且非常容易集成到应用程序中。
该加载项集成在您的应用程序中,不需要为每个用户单独安装。设置完成后,您的应用程序将能够在较高级别捕获所有错误。因此,您将能够捕获“记录已删除”错误并将其集中处理。

关于ms-access - 检测是否在 Access 绑定(bind)表上删除了当前记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10416567/

相关文章:

VBA 命名范围检查名称是否存在的最有效方法

Access查询的SQL 2005替代

ms-access - 有没有办法禁用 Access 2007 的代码编辑器 CTRL+Y 快捷键?

sql - MS Access VBA - 使用 SELECT INTO 创建新表并添加记录

ms-access - MS Access 数据库中的 MS Reporting Services 报表查看器

Excel 行混合

html - 使用 VBA 和 HTML 单击自动完成列表中的项目

excel - 我正在尝试针对未找到搜索项的代码进行调整

sql-server - Access VBA 连接以测试 SQL Server 是否存在

vba - Excel VBA,访问URL时收到提示 "Windows security"