当更新表单上的复选框时,以连续形式访问oldValue以进行控制会在Update之前生成错误3251

时间:2012-01-13 21:42:14

标签: ms-access vba ms-access-2007 access-vba

这是我在MS Access中看到的一个陌生问题。我以连续的形式提供以下代码:

Private Sub thisForm_BeforeUpdate(Cancel As Integer)
If Not Cancel Then
    Debug.Print "pre-logging data changes..."

    ' here we need to doublecheck to see if any values changed.
    ' we simply iterate through the whole list, re-setting oldValue
    ' and newValue.
    For Each control In thisForm.Section(acDetail).controls
        If control.ControlType = acTextBox Or _
           control.ControlType = acComboBox Or _
           control.ControlType = acListBox Or _
           control.ControlType = acOptionGroup Or _
           control.ControlType = acCheckBox Then
            Debug.Print control.Name
            oldValues(control.Name) = control.oldValue
            newValues(control.Name) = control.value
        End If
    Next
End If
End Sub

oldValues和newValues是Dictionary对象(尽管可能与该问题无关)。

我的表单有3个文本框控件和一个复选框控件。其中一个文本框控件被禁用,并通过简单内连接的结果填充(以获取与外键关联的人类可读名称)。数据源来自表单的记录源(没有使用DLookup或任何东西)。

如果我编辑其他两个文本框控件之一,此代码运行绝对正常。但是,如果我切换窗体上的复选框,我会收到运行时错误3251.在监视窗口中,当我尝试查看“控件”的属性时,我再次收到错误。它将禁用控件的oldValue值显示为“Reserved Error”。

如果它始终这样做,我认为这是由于控制被禁用;但是,当其他文本框接收编辑时,它可以正常工作,并且仅在切换复选框时中断;我很难过。我几乎倾向于相信我发现了访问中的错误,但我可以使用一些额外的输入。

其他人每次遇到这样的问题吗?

编辑:在进一步挖掘时,我发现实际上只有3个可编辑字段中的一个不会触发此错误。它包含字符串数据。其他两个控件包含日期值和是/否值。现在我更加困惑。

1 个答案:

答案 0 :(得分:1)

我对这个问题有两个想法。

第一个:如果表单的RecordSource是链接到SQL-Server的ODBC表,那么应该为CheckBox-Column设置标准值。否则,它将尝试将NULL设置为False并抛出错误,说明其他人编辑了当前记录。

第二个想法:有时Access只有一点点"打嗝"当它编译代码时。您可以备份数据库,然后尝试使用运行...窗口中的"C:\Program Files\Microsoft Office 2007\Office12\MSACCESS.EXE" "C:\yourFolder\yourDatabase.accdb" /decompile对其进行反编译(当然,您必须在计算机上插入路径)。这通常有助于解决奇怪的问题。