更新表单上的复选框时,以连续形式访问 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的主要内容,如果未能解决你的问题,请参考以下文章