这是我在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个可编辑字段中的一个不会触发此错误。它包含字符串数据。其他两个控件包含日期值和是/否值。现在我更加困惑。
答案 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
对其进行反编译(当然,您必须在计算机上插入路径)。这通常有助于解决奇怪的问题。