Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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
Ms access 在Access中编辑记录时跟踪值的更改_Ms Access_Vba - Fatal编程技术网

Ms access 在Access中编辑记录时跟踪值的更改

Ms access 在Access中编辑记录时跟踪值的更改,ms-access,vba,Ms Access,Vba,我试图在编辑记录时跟踪值更改。表单上的所有字段都是未绑定的文本框 If (clt.ControlType = acTextBox _ Or clt.ControlType = accombox) 下面是一个用于插入审核跟踪记录的函数 Public Function AuditChanges(RecordID As String, UserAction As String) Dim DB As Database Dim rst As Recordset Dim

我试图在编辑记录时跟踪值更改。表单上的所有字段都是未绑定的文本框

If (clt.ControlType = acTextBox _
    Or clt.ControlType = accombox)
下面是一个用于插入审核跟踪记录的函数

Public Function AuditChanges(RecordID As String, UserAction As String)

    Dim DB As Database
    Dim rst As Recordset
    Dim clt As Control
    Dim Userlogin As String

    Set DB = CurrentDb
    Set rst = DB.OpenRecordset("select * from tbl_audittrail", adOpenDynamic)

    Userlogin = Environ("username")

    Select Case UserAction

        Case "Edit"
            For Each clt In Screen.ActiveForm.Controls

                If (clt.ControlType = acTextBox _
                    Or clt.ControlType = accombox) Then
                    If Nz(clt.Value) <> Nz(clt.OldValue) Then
                        With rst
                            .AddNew
                            ![DateTime] = Now()
                            !UserName = Userlogin
                            !FormName = Screen.ActiveForm.Name
                            !Action = UserAction
                            !RecordID = Screen.ActiveForm.Controls(RecordID).Value
                            !FieldName = clt.ControlSource
                            !OldValue = clt.OldValue
                            !Newvalue = clt.Value
                            .Update
                        End With
                    End If
                End If
            Next clt
    End Select

    rst.Close
    DB.Close
    Set rst = Nothing
    Set DB = Nothing
End Function
If (clt.ControlType = acTextBox _
    Or clt.ControlType = accombox)
问题是当它调用AuditChanges时,它直接从

If (clt.ControlType = acTextBox _
    Or clt.ControlType = accombox)
如果

If (clt.ControlType = acTextBox _
    Or clt.ControlType = accombox)
当前表单上的所有字段都是未绑定的文本框,您必须按“添加”命令按钮才能实际添加记录。我认为控件类型一定有问题,但我不确定应该使用哪种控件类型。有什么想法吗?

从每个模块的顶部开始。
If (clt.ControlType = acTextBox _
    Or clt.ControlType = accombox)
它强制执行变量声明,并在编译时报告未声明或拼写错误的变量/常量。 要在新模块中自动执行此操作,请在VBA编辑器中设置该选项。 这对于VBA开发来说确实是必须的

If (clt.ControlType = acTextBox _
    Or clt.ControlType = accombox)
然后编译器会告诉您,
accombox
不存在,它应该是
accombox

If (clt.ControlType = acTextBox _
    Or clt.ControlType = accombox)
如果没有
选项Explicit
accombox
被初始化为空变量,并导致整个
If
条件为空,因此永远不会被输入。

首先将其放在每个模块的顶部。
If (clt.ControlType = acTextBox _
    Or clt.ControlType = accombox)
它强制执行变量声明,并在编译时报告未声明或拼写错误的变量/常量。 要在新模块中自动执行此操作,请在VBA编辑器中设置该选项。 这对于VBA开发来说确实是必须的

If (clt.ControlType = acTextBox _
    Or clt.ControlType = accombox)
然后编译器会告诉您,
accombox
不存在,它应该是
accombox

If (clt.ControlType = acTextBox _
    Or clt.ControlType = accombox)

如果没有
Option Explicit
accombox
被初始化为空变量,并导致整个
If
条件为空,因此永远不会被输入。

此外,未绑定控件没有旧值。但要更新记录,我必须先检索一条记录,然后更新记录上的某些字段(主键除外)。在这种情况下,更新前的值应该被视为OldValue,对吗?我对编码很陌生,所以如果我犯了愚蠢的错误,请原谅我。很难说,但安德烈是正确的,没有“accombox”这样的东西。您可能应该在其中放一行代码,上面写着“msgbox”控件名:&clt.Name&“,ControlType:&ctl.ControlType”(不带单引号)并将其放入循环中。这样,您就可以知道每个控件的调用和类型。我想,如果您在页面上看到每个控件的此信息,您会发现自己做错了什么。我已更正了控件类型。我仍然无法跟踪我的更改。还有其他方法吗?我所有的更改都在acTextBox和代码甚至不尝试比较当前值和旧值。如果这是因为未绑定的文本框,是否有其他方法跟踪CHNSGE?谢谢。Access给您的表触发器时为什么要经历这种麻烦?使用表触发器/数据宏自动捕获更改>=Access 2010另外,未绑定控件没有旧值。但是要更新记录,我必须先检索记录,然后更新记录上的某些字段(主键除外)。在这种情况下,更新前的值应该被视为旧值,对吗?我在编码方面很新,所以如果我犯了愚蠢的错误,请原谅。很难说,但Andre是正确的,没有“accombox”这样的东西“。您可能应该在其中放一行代码,上面写着‘msgbox’控件名:&clt.Name&',ControlType:&ctl.ControlType'(不带单引号)并将其放入循环中。这样,您就可以知道每个控件的调用和类型。我想,如果您在页面上看到每个控件的此信息,您会发现自己做错了什么。我已更正了控件类型。我仍然无法跟踪我的更改。还有其他方法吗?我所有的更改都在acTextBox和代码甚至不尝试比较当前值和旧值。如果这是因为未绑定的文本框,还有其他方法跟踪CHNSGE吗?谢谢。Access给您的表触发器时为什么要经历这种麻烦?使用表触发器/数据宏自动捕获更改>=Access 2010谢谢。我会这样做。但我认为这不会有帮助p因为屏幕上没有组合框。谢谢。我会的。但我认为这不会有帮助,因为屏幕上没有组合框。
If (clt.ControlType = acTextBox _
    Or clt.ControlType = accombox)