如何确定导致数据库更新的原因

时间:2014-11-18 20:17:19

标签: vba events ms-access

我有一个问题,重新考虑如何确定记录更新的来源......

我有一个包含多个表和多个表单的Access 2010数据库。所有表单都有VBA代码。许多VBA子和函数插入,更新或删除记录。我使用afterupdate,afterinsert和afterdelete事件来写入对审计表所做更改的详细信息。审计表存储详细信息,例如更改的时间,更改者和更改内容(操作类型,表,记录ID等)。

正如我所提到的,许多不同的子/函数都会对数据库进行更改。我想知道的是,如何找出哪个子/功能模块启动了数据库更改请求?

目前我已经为每个子/功能模块添加了一个全局字符串变量来更新数据库,并在afterupdate / afterdelete / afterinsert事件中的crearecord的setfield中调用了一个函数来读取变量,所以把它放在审计表记录。这是一个解决方案,但不是很好的解决方案。 有人有更好的想法吗?

在Web开发中,我可以读取HTTP服务器变量以查看用户如何到达当前页面(referrer和referrer_URL)。在Access中的一个对象中是否隐藏了一些可以给我类似的内容?

1 个答案:

答案 0 :(得分:0)

我假设(希望?祈祷??)这一切都在一个模块中完成。换句话说,您将所有这些信息作为变量传递给公共函数。如果没有,你应该。当您传递变量时,只需将函数名称与所有其他数据一起传递给它。

例如,您将在模块中拥有一个公共函数,如下所示:

Public Function ChangeLog(chgDate As Date, strByWhom As String, etc..., strModName as String)
On Error GoTo Err_Handler

'Put some code here to write all the variables into fields in your ChangeLog table

Exit_Handler:
    Exit Function

Err_Handler:
    MsgBox "Error " & Err.Number & " - " & Err.Description, vbExclamation, "CalendarFor()"
    Resume Exit_Handler
End Function

然后你只需将所有变量传递给它(假设一个名为MyForm的表单,并将其放在After Update事件中):

Call ChangeLog(Now(), CurrUser, etc..., "MyForm - AfterUpdate")

显然这是"航空代码",但我确定你明白了。