我目前正在努力将审计跟踪添加到MS-Access 2010数据库,我正在努力解决
"错误3251:此类型对象不支持操作"
以下是我的审计跟踪模块的代码,主要是来自web的代码:
Public Function auditChanges(RecordID As String, userAction As String, cForm As Form)
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim ctl As Control
Dim userLogin As String
Set db = CurrentDb
Set rst = db.OpenRecordset("SELECT * FROM T_AUDIT")
userLogin = getCurrentUser
Select Case userAction
Case "New"
With rst
.AddNew
![Date] = Now()
![utilisateur] = userLogin
![nomFormulaire] = cForm.Name
![Action] = userAction
![RecordID] = cForm.Controls(RecordID).Value
.Update
End With
Case "Delete"
With rst
.AddNew
![Date] = Now()
![utilisateur] = userLogin
![nomFormulaire] = cForm.Name
![Action] = userAction
![RecordID] = cForm.Controls(RecordID).Value
.Update
End With
Case "Edit"
For Each ctl In cForm.Controls
If (ctl.ControlType = acTextBox) Or (ctl.ControlType = acComboBox) Or (ctl.ControlType = acCheckBox) Then
If (Nz(ctl.Value, "") <> Nz(ctl.OldValue, "")) Then
With rst
.AddNew
![Date] = Now()
![utilisateur] = userLogin
![nomFormulaire] = cForm.Name
![Action] = userAction
![RecordID] = cForm.Controls(RecordID).Value
![champs] = ctl.ControlSource
![ancienneValeur] = ctl.OldValue
![nouvelleValeur] = ctl.Value
.Update
End With
End If
End If
Next ctl
End Select
rst.Close
db.Close
Set rst = Nothing
Set db = Nothing
End Function
在我要跟踪的表单的beforeUpdate
事件中调用此函数。
尝试编辑绑定文本框时会触发错误。而
If (Nz(ctl.Value, "") <> Nz(ctl.OldValue, "")) Then
行是引发错误的行
该表单基于2个与一对多关系链接的表格。当我编辑表格中的字段时,该功能正在工作,这些字段位于&#34; One&#34;关系的一部分,但当我想编辑&#34;很多&#34;中的字段时,它会抛出错误。侧。
我希望我足够清楚,谢谢
编辑:更多详情
我的表单基于该请求:
SELECT T_REVISION.ID_revision, T_REVISION.fk_ID_proposition, T_REVISION.numero, T_REVISION.fk_etat_revision, T_REVISION.EOTP, T_PROPOSITION.reference_simple, T_PROPOSITION.libelle, T_REVISION.description_localisation
FROM T_PROPOSITION INNER JOIN T_REVISION ON T_PROPOSITION.ID_proposition = T_REVISION.fk_ID_proposition
ORDER BY T_REVISION.numero DESC;
从T_PROPOSITION.reference_simple
控件触发错误。
错误3251发生时:我尝试编辑 T_REVISION.EOTP , T_REVISION.description_localisation 字段。编辑 T_PROPOSITION.reference_simple , T_PROPOSITION.libelle 时,错误3251不会出现!
所以:我能够编辑来自&#34; One&#34;关系的一面,但当我想编辑&#34;很多&#34;似乎我无法访问oldValue属性
我该如何解决这个问题?
答案 0 :(得分:1)
当你没有指定弹出错误的行时,很难确切地说出导致错误的原因,但有一个明显的可能性。
你正在控制循环中捕获Null
If (Nz(ctl.Value, "") <> Nz(ctl.OldValue, "")) Then
更重要的是,你错过了一个前括号“(”
但是,在将控件的值和旧值分配给记录集时,您不会陷入这种可能性。
![ancienneValeur] = ctl.OldValue
![nouvelleValeur] = ctl.Value
您的字段ancienneValeur
和nouvelleValeur
是否允许为其分配空或零长度字段?
在任何情况下,您应该保持一致,并确保在将它们分配给表的字段之前捕获空值。
![ancienneValeur] = NZ(ctl.OldValue,"")
![nouvelleValeur] = NZ(ctl.Value,"")
答案 1 :(得分:1)
不完全是答案,但评论区域不合适......
如果要在If (Nz(ctl.Value, "") <> Nz(ctl.OldValue, "")) Then
之前添加2行:
debug.print ctl.Name, ctl.value
debug.print ctl.name, ctl.oldvalue
这将允许您查看错误是否链接到特定控件和特定属性,并缩小搜索范围。
修改:编辑OP后,表明问题出现在&#34;很多&#34;您加入的一方,我认为您应该将表单更改为"main form - subform" architecture。这将允许您正确跟踪每个TABLE的更新。