MS Access“记录更改”日志

时间:2011-10-28 09:14:51

标签: ms-access vba

每当在表单上删除或更新记录时,我想将其旧值保存在历史记录表中(让我们称之为修订版)。我想我必须做以下事情:

记录更改

  • 使用BeforeUpdate事件将数据保存在某处(集合?数组?或记录集 - 修订后的表 - 不保存?)
  • 使用AfterUpdate事件将该数据添加/保存到修订表

删除

  • 使用OnDelete事件来保存数据 - 但又如何?由于表格(事实上是一个子表格)在数据表视图中
  • ,因此可以立即删除多个记录
  • 使用AfterDelConfirm将该数据添加到Revised表。

您是否有任何线索,评论或链接?
这一切都在“纯访问”(无SQL Server)中。 非常感谢!


编辑:像往常一样,正确地问这个问题会给我一些想法:

选项1

使用BeforeUpdate或OnDelete构建SQL语句,并使用AfterUpdate或AfterDelConfirm来执行SQL语句。但这不适用于多次删除?

选项2

将修订记录集定义为ta form level,插入记录“Before”但仅更新“After”。同样,多次删除的问题。

3 个答案:

答案 0 :(得分:3)

我在几个不同的项目中成功使用了Allen Browne方法的变体。查看他的网站了解更多详情:

Creating an Audit Log

他的解决方案使用临时表和四个通用函数调用来处理多次删除的问题。

答案 1 :(得分:3)

我最近考虑过的另一种方法,即没有机会实际实施,将使用事务来执行更改跟踪。基本算法是:

  1. 在进行任何更改之前在工作区上使用BeginTrans
  2. 在OnDelete事件中
    • 执行代码执行中的删除操作从步骤1
    • 对工作区执行删除查询
    • 将记录添加到更改审核表
  3. 在BeforeDelConfirm事件中
    • 设置取消=真
    • 显示您自己的确认对话框
    • 如果用户确认了工作区上的CommitTrans
    • 否则在工作区上回滚事务
  4. 更新/插入的类似方法。这样可以避免使用临时表/数组/集合等,但我还没有完全考虑过所有内容。魔鬼可能在细节中。

答案 2 :(得分:0)

可以为多个表实现的“简单”通用解决方案是拥有一个跟踪表,由以下内容组成:

Track_Table
==================================================
id_track as primary key
id_table as name of the table which has been updated
id_primaryKey as the record identifier (the PK of the updated record)
changeType, being either DEL or UPDATE
changeDate, as dateTime value
fieldName, as text
oldValue, as text or memo
newValue, as text or memo

如果您必须确定执行更新的用户,只需添加

即可
userId

在你的桌子上......

然后,您可以在所选表单的beforeUpdate和afterUpdate事件上创建一些通用的“更新前”和“更新后的函数”。 beforeUpdate函数将旧值存储在变量中,而afterUpdate函数将填充缺失的数据并在轨道表中插入新记录。

您必须找到一种方法来找出正确的\相应的表名和字段名。如果您使用视图或字段别名在表单中显示数据,则可能会很困难。

当然,要遵循的所有表都必须具有主键,以便您可以跟踪记录级别的更改。在多个领域设置的PK肯定会有问题....

oldValues和newValues必须转换为文本,以便将它们存储在文本或备注字段中

相关问题