.oldValue 控件属性上的错误 3251
Posted
技术标签:
【中文标题】.oldValue 控件属性上的错误 3251【英文标题】:Error 3251 on .oldValue control property 【发布时间】:2016-08-19 13:46:34 【问题描述】:我目前正在向 MS-Access 2010 数据库添加审计跟踪,我正在努力解决
“错误3251:此类型对象不支持操作”
这是我的审计跟踪模块的代码,主要是来自网络的整理代码:
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 个表。当我从表中编辑与关系的“一”部分相关的字段时,该功能正在工作,但当我想从“多”端编辑字段时,它会引发错误。
希望我说的够清楚,谢谢
编辑:更多细节
我的表格是基于该请求:
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 不会发生!
所以:我能够编辑来自关系“一”端的值,但是当我想编辑“多”端时,似乎无法访问 oldValue 属性
我该如何解决这个问题?
【问题讨论】:
显示错误发生的行将有助于我们为您提供帮助 是的,对不起!触发错误 3251 的行是If (Nz(ctl.Value, "") <> Nz(ctl.OldValue, "")) Then
您有绑定到“许多”边栏的子表单或数据表吗?
【参考方案1】:
不完全是答案,但是评论区不适合……
如果在 If (Nz(ctl.Value, "") <> Nz(ctl.OldValue, "")) Then
之前添加 2 行:
debug.print ctl.Name, ctl.value
debug.print ctl.name, ctl.oldvalue
这将允许您查看错误是否与特定控件和特定属性相关联,并缩小搜索范围。
编辑:在您编辑您的 OP 后表明问题出现在您加入的“多”方面,我认为您应该将您的表单更改为 "main form - subform" architecture。这将允许您正确跟踪每个 TABLE 的更新。
【讨论】:
通过一些解决方法,我设法将表单建立在一个表上,并将另一个表放在子表单中,如您所说。现在它按预期工作!谢谢【参考方案2】:当您不指定弹出错误的行时,很难准确判断导致错误的原因,但有一种明显的可能性。
您在控制循环中为 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,"")
【讨论】:
触发错误 3251 的行是If (Nz(ctl.Value, "") <> Nz(ctl.OldValue, "")) Then
更新了答案,并添加了关于缺少前括号的评论
或者这只是您评论的本地错字?以上是关于.oldValue 控件属性上的错误 3251的主要内容,如果未能解决你的问题,请参考以下文章
为啥将 <%= %> 表达式作为服务器控件上的属性值会导致编译错误?
改变控件在窗体中的上下位置应修改控件的啥属性 这些属性在编程里面会用到