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

dma*_*rra 6 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

每个人都遇到过这样的问题吗?

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

小智 1

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

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

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