Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba Access 2010数据库中的审计跟踪_Vba_Logging_Ms Access 2010_Audit - Fatal编程技术网

Vba Access 2010数据库中的审计跟踪

Vba Access 2010数据库中的审计跟踪,vba,logging,ms-access-2010,audit,Vba,Logging,Ms Access 2010,Audit,我正在尝试在Access 2010数据库中创建审计跟踪。我在www.wvmitchell.com上找到了一些代码,除了一个问题外,它运行良好。它记录已更新的记录,但不记录新记录或已删除的记录。记录这些是非常重要的。以下是我使用的信息和代码: Option Compare Database Option Explicit Sub TrackChanges(F As Form) Dim ctl As Control, frm As Form Dim MyField As String, MyKey

我正在尝试在Access 2010数据库中创建审计跟踪。我在www.wvmitchell.com上找到了一些代码,除了一个问题外,它运行良好。它记录已更新的记录,但不记录新记录或已删除的记录。记录这些是非常重要的。以下是我使用的信息和代码:

Option Compare Database
Option Explicit

Sub TrackChanges(F As Form)
Dim ctl As Control, frm As Form
Dim MyField As String, MyKey As Long, MyTable As String
Dim db As DAO.Database, rs As DAO.Recordset
On Error Resume Next
Set frm = F
Set db = CurrentDb
Set rs = db.OpenRecordset("tbl__ChangeTracker")
With frm
    MyTable = .Tag
    ' find the primary key & its value, based on the Tag
    For Each ctl In .Controls
        If ctl.Tag = "PK" Then
            MyField = ctl.Name
            MyKey = ctl
            Exit For
        End If
    Next ctl
    For Each ctl In .Controls
        ' inspect only data-bound controls
        Select Case ctl.ControlType
            Case acTextBox, acComboBox, acCheckBox
                If Nz(ctl.ControlSource, "") > "" Then
                    ' if changed, record both old & new values
                    If Nz(ctl.OldValue, "")<> Nz(ctl, "") Then
                        rs.AddNew
                        rs!FormName = .Name
                        rs!MyTable = MyTable
                        rs!MyField = MyField
                        rs!MyKey = MyKey
                        rs!ChangedOn = Now()
                        rs!FieldName = ctl.Name
                        If ctl.ControlType = acCheckBox Then
                            rs!Field_OldValue = YesOrNo(ctl.OldValue)
                            rs!Field_NewValue = YesOrNo(ctl)
                        Else
                            rs!Field_OldValue = Left(Nz(ctl.OldValue, ""), 255)
                            rs!Field_NewValue = Left(Nz(ctl, ""), 255)
                        End If
                        rs!UserChanged = UserName()
                        rs!CompChanged = CompName()
                        rs.Update
                    End If
                End If
        End Select
    Next ctl
End With
rs.Close
Set rs = Nothing
Set db = Nothing
End Sub

Private Function YesOrNo(v) As String
    Select Case v
        Case -1
            YesOrNo = "Yes"
        Case 0
            YesOrNo = "No"
    End Select
End Function
添加这些对象后,按如下方式修改每个表单: 1.设置表单的标记属性=基础表的名称。 2.为表单后面的数据标识主键,并设置标记属性=“PK”(不带引号)。字段不必在表单上可见,它只需要在某个地方。 3.添加

Form_BeforeUpdate event and invoke the tracking code using:
   TrackChanges Me
四,。如果您使用的是子表单,那么还需要为每个子表单执行这三个步骤


在我的数据库中,我向tbl_ChangeTracker添加了一个名为Action的文本字段。我需要知道如何编写代码来填充它。提前感谢您对我的帮助。

您已经编写了代码

                If Nz(ctl.ControlSource, "") > "" Then
                ' if changed, record both old & new values
                If Nz(ctl.OldValue, "")<> Nz(ctl, "") Then
然后在审计过程中,将其更改为接受另一个String类型的参数,例如:

Sub TrackChanges(F As Form, action As String)
然后在你想要的代码中

Select Case action
Case is = "New"
 ' code here for adding new record, as an example
Case is = "Edit"
'your code as you have it above here for edits
如果要跟踪删除,请在“删除前”事件中执行相同的操作

Call TrackChanges(Me,"DELETE")
然后在TrackChanges过程中,另一个案例是=“Delete”,然后是处理删除的代码

这应该会让你走上正确的道路,然后用你的行动领域,你可以做到!action=操作,以便您知道它是编辑、添加还是删除等

嗯 标记

在评论后编辑1,以便查看布局; 选择案例代码将位于TrackChanges功能中。在“使用Frm”之前,放置所选案例。那么你想把它列出来如下

Select Case action
 Case is = "Edit"
       With frm 'etc all your code here for if you edit record
Case is = "new"
       With frm 'etc all your code here for if adding new record
End select

让我知道这是否有意义,如果不给我一个pm,我可以告诉你更多的深度,如果你需要:)

我更喜欢使用艾伦·布朗的审计跟踪:涵盖大多数基础。艾伦·布朗的审计跟踪规定所有主键必须是自动编号。我数据库中的一些主键是字母和数字的组合。这就是为什么我没有尝试他的审计线索。谢谢你,马克。这帮了大忙。我还有一个问题。请记住这对我来说是新的。我应该将选择案例代码放在哪里?我应该把它放在另一个函数中,还是放在我的代码中的某个地方,以及应该放在哪里?请参阅我对布局的更新回答,作为如何处理布局的一般要点,让我知道这是否有意义,如果没有,请给我一个pm,如果你需要,我可以更深入地与你交谈:)非常感谢。我会努力的,然后再打给你。你帮了我很多忙。我制定了使用Case语句的代码。frm的代码保持原样,我将代码放在第一个ctl之后。TrackChanges(Me,“Delete”)在删除前事件中不起作用。它在OnDelete事件中起作用。我想分享我的代码,以便其他人可以使用它,但我不知道如何做到这一点。你能告诉我怎么做吗?很高兴你到了那里:)!感觉很好,不是吗?呵呵。你可以随时编辑你的第一篇文章,并在文章结尾处添加更新内容。如果你也能把我的答案标记为正确的,或者你是怎么做的(如果它确实有用的话!),那也太好了!
Call TrackChanges(Me,"DELETE")
Select Case action
 Case is = "Edit"
       With frm 'etc all your code here for if you edit record
Case is = "new"
       With frm 'etc all your code here for if adding new record
End select