我正在尝试根据我在组合框中选择的值和另一个文本框中的预先存在的值来设置文本框的值。两个控件都在表单中的连续子表单中。一键是保存记录OnDirty for Combo1,然后执行代码以更新TextBox1 AfterUpdate。一切正常,但每次我在Combo1中更改值时都会收到以下错误消息:
Run-time error '2115':
The macro or function set to the BeforeUpdate or ValidationRule property for this field is preventing Database from saving the data in the field.
如果我在错误消息上单击“结束”,我很好。我对连接到这些表单的任何表上的任何元素都没有验证规则。我没有在表单或子表单上使用BeforeUpdate或ValidationRule属性。
现在代码如下:
Private Sub Combo1_Dirty(Cancel As Integer)
DoCmd.RunCommand acCmdSaveRecord
End Sub
Private Sub Combo1_AfterUpdate()
DoCmd.RunCommand acCmdSaveRecord
Dim con As ADODB.Connection
Set con = Application.CurrentProject.Connection
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
ssql = "(SELECT TABLE1.DESCRIPTION As d1 " & _
"FROM TABLE1 " & _
"INNER JOIN TABLE2 ON " & _
"(TABLE1.CATEGORY = TABLE2.CATEGORY) " & _
"AND (TABLE1.LEVEL = TABLE2.LEVEL) " & _
"WHERE " & _
"(((TABLE1.LEVEL)= " & [Forms]![MainForm].[Subform].Form.Combo1.Value & ") " & _
"AND ((TABLE2.CATEGORY)= '" & [Forms]![MainForm].[Subform].Form.[CATEGORY].Value & "'));)"
rs.Open ssql, con
Do Until rs.EOF = True
[Forms]![MainForm].[Subform].Form.TextBox1.SetFocus
[Forms]![MainForm].[Subform].Form.TextBox1.Text = rs.Fields!d1
rs.MoveNext
Loop
End Sub
当我点击“调试”时,会突出显示以下代码行:
[Forms]![MainForm].[Subform].Form.TextBox1.Text = rs.Fields!d1
同样,TextBox1控件或其下面的数据元素都没有设置任何验证规则,并且我的代码没有使用任何BeforeUpdate(实际上,在数据库中的任何地方都没有使用它)。任何想法为什么我会收到错误,即使它正在以其他方式工作?
非常感谢任何帮助。谢谢!
答案 0 :(得分:1)
首先,在BeforeUpdate之前调用Dirty,在AfterUpdate之前调用, 所以你不需要在Dirty和AfterUpdate中保存记录,我只是完全抛弃Dirty的代码,因为它并没有真正添加任何内容。
尝试:
[Forms]![MainForm].[Subform].Form.TextBox1.Value = rs!d1
而不是
[Forms]![MainForm].[Subform].Form.TextBox1.SetFocus
[Forms]![MainForm].[Subform].Form.TextBox1.Text = rs.Fields!d1
另外,是否有一个特殊原因是您要遍历整个记录集只是为了设置一个文本框?文本框是否有控制源? 将子表单的记录源更改为rs不是更容易吗?