.oldValue控件属性上的错误3251

时间:2016-08-19 13:46:34

标签: vba ms-access access-vba ms-access-2010

我目前正在努力将审计跟踪添加到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属性

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

当你没有指定弹出错误的行时,很难确切地说出导致错误的原因,但有一个明显的可能性。

你正在控制循环中捕获Null

If (Nz(ctl.Value, "") <> Nz(ctl.OldValue, "")) Then

更重要的是,你错过了一个前括号“(”

但是,在将控件的值和旧值分配给记录集时,您不会陷入这种可能性。

![ancienneValeur] = ctl.OldValue
![nouvelleValeur] = ctl.Value

您的字段ancienneValeurnouvelleValeur是否允许为其分配空或零长度字段?

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

![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的更新。