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)