.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, "") &lt;&gt; 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.EOTPT_REVISION.description_localisation 字段。当我编辑 T_PROPOSITION.reference_simpleT_PROPOSITION.libelle 时,错误 3251 不会发生

所以:我能够编辑来自关系“一”端的值,但是当我想编辑“多”端时,似乎无法访问 oldValue 属性

我该如何解决这个问题?

【问题讨论】:

显示错误发生的行将有助于我们为您提供帮助 是的,对不起!触发错误 3251 的行是 If (Nz(ctl.Value, "") &lt;&gt; 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

您的字段ancienneValeurnouvelleValeur 是否允许将空字段或零长度字段分配给它们?

在任何情况下,您都应该保持一致,并确保在将空值分配给表的字段之前捕获它们。

![ancienneValeur] = NZ(ctl.OldValue,"")
![nouvelleValeur] = NZ(ctl.Value,"")

【讨论】:

触发错误 3251 的行是 If (Nz(ctl.Value, "") &lt;&gt; Nz(ctl.OldValue, "")) Then 更新了答案,并添加了关于缺少前括号的评论 或者这只是您评论的本地错字?

以上是关于.oldValue 控件属性上的错误 3251的主要内容,如果未能解决你的问题,请参考以下文章

为啥将 <%= %> 表达式作为服务器控件上的属性值会导致编译错误?

改变控件在窗体中的上下位置应修改控件的啥属性 这些属性在编程里面会用到

允许服务器/用户控件上的任何属性/属性

无法访问用户控件上的公共属性wpf c#

DevExpress控件 在 winform 上的一些控件的常用属性设置

是否可以绑定到装饰元素容器上的属性?