【发布时间】:2017-04-11 01:39:32
【问题描述】:
我正在尝试在编辑记录时跟踪值更改。表单上的所有字段都是未绑定的文本框。
以下是用于插入审计跟踪记录的函数。
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
以下是我如何使用该功能:
Private Sub btnUpdate_Click()
Set DB = CurrentDb
Set rs = DB.OpenRecordset("SELECT * FROM ASID", dbOpenDynaset, dbSeeChanges)
rs.Edit
rs!ISIN = Me.ISIN
rs!SECIDTYPE = Me.SECIDTYPE
rs!ALTSECID = Me.ALTSECID
rs.Update
Call AuditChanges("ISIN", "Edit")
End If
End Sub
问题是当它调用 AuditChanges 时,它直接从
If (clt.ControlType = acTextBox _
Or clt.ControlType = accombox)
致End If
当前表单上的所有字段都是未绑定的文本框,您必须按“添加”命令按钮才能实际添加记录。我认为控件类型一定有问题,但我不确定应该使用哪种控件类型。有什么想法吗?
【问题讨论】:
-
另外,未绑定的控件没有OldValue。
-
但是要更新一条记录,我必须先检索一条记录,然后更新它上面的某些字段,除了主键。在这种情况下,更新前的值应该被视为 OldValue,对吗?我是编码新手,如果我犯了愚蠢的错误,请原谅我。
-
很难说,但安德烈是正确的,没有“accombox”这样的东西。您可能应该做的是在其中放置一行代码,上面写着' msgbox "Control Name: & clt.Name & ", ControlType: " & ctl.ControlType '(不带单引号)并将其放入循环中。这个这样您就可以知道每个控件的名称及其类型。我想如果您在页面上看到每个控件的此信息,您就会知道自己做错了什么。
-
我已经更正了控件类型。我仍然无法跟踪我的更改。有没有其他方法可以做到这一点?我所有的更改都在 acTextBox 中完成,代码甚至没有尝试比较当前值和旧值。如果那是因为未绑定的文本框,还有其他方法可以跟踪 chsnge 吗?谢谢。
-
当 Access 为您的表提供触发器时,为什么要经历这个麻烦?使用表触发器/数据宏自动捕获更改 >= access 2010