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

Posted

技术标签:

【中文标题】更新表单上的复选框时,以连续形式访问 oldValue 以在 beforeUpdate 中生成错误 3251【英文标题】:access to oldValue for control in continous form generates error 3251 in beforeUpdate when a checkbox on form is updated 【发布时间】:2012-01-13 21:42:13 【问题描述】:

这是我在 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 值显示为“保留错误”。

如果它一直这样做,我会认为这是由于控件被禁用;但是因为当其他文本框收到编辑时它可以正常工作,并且只有在复选框被切换时才会中断;我难住了。我几乎倾向于相信我在访问中发现了一个错误,但我可以使用一些额外的输入。

还有其他人遇到过这样的问题吗?

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

【问题讨论】:

检查导致问题的字段是超链接还是有关联的OnUpdate事件。 【参考方案1】:

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

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

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

【讨论】:

以上是关于更新表单上的复选框时,以连续形式访问 oldValue 以在 beforeUpdate 中生成错误 3251的主要内容,如果未能解决你的问题,请参考以下文章

访问连续表单:记录状态

如果提交表单时未选中复选框,如何将布尔值更新为 0

访问VBA:从另一个表单获取复选框的价值

以 PHP 形式发送复选框值

如何在连续子表单中使用未绑定复选框 - MS Access 2013

访问:如果从组合框中选择了以“(REF)”开头的值,则勾选表单上的复选框