访问子窗体未绑定控件#Error
Posted
技术标签:
【中文标题】访问子窗体未绑定控件#Error【英文标题】:Access subform unbound control #Error 【发布时间】:2014-01-17 01:38:40 【问题描述】:我在主表单中嵌入了一个子表单作为数据表。在我选择一些过滤条件并单击“搜索”按钮后,子表单的数据会被填充。除了我在这个子表单中的一个控件外,一切都很好。这是一个未绑定的控件,我将在子窗体的 onLoad 事件中使用从我的子窗体的其他控件输入的值设置它的控件源。当我第一次加载主表单并在选择任何内容或单击“搜索”按钮之前,子表单会显示一个空的记录行。但是,在我的未绑定控件的列上,它显示为“#ERROR”,而其他都是空白的。我知道在我进行搜索并且未绑定的控件数据被填充后这会正常工作,但是无论如何我可以避免在我的子表单中显示丑陋的“#ERROR”吗?
我的部分代码在这里。
Private Sub Form_Load()
Me.text_root_cause_field.ControlSource = "=getLatestRemark([plant], [shipment_no])"
End Sub
Public Function getLatestRemark(plant_code As String, shipment_no As String) As String
Dim db As Database
Dim srRS As Recordset
Set db = CurrentDb
Set srRS = db.OpenRecordset("SELECT TOP 1 root_cause FROM Shipment_Remark" _
& " WHERE plant = '" & plant_code & "'" _
& " AND shipment_no = '" & shipment_no & "'" _
& " ORDER BY update_time DESC", dbOpenDynaset)
If Not srRS Is Nothing Then
If Not srRS.EOF Then
getLatestRemark = srRS!root_cause
srRS.Close
Set srRS = Nothing
End If
Else
getLatestRemark = ""
End If
db.Close
Set db = Nothing
End Function
这些是我的子表单的代码。 text_root_cause_field 是我正在谈论的未绑定字段。它的控制源依赖于另外两个绑定字段 - [plant] 和 [shipment_no]。但是,字段 [plant] 和 [shipment_no] 仅在用户单击主窗体中的搜索按钮并设置子窗体的记录源后在运行时绑定。
感谢您的帮助。
【问题讨论】:
即使您要在搜索后更改它,您是否至少不能将其绑定到有效列? @HK1 感谢您的建议。我试图在我的子窗体的记录源中包含一个空列并将该列绑定到该控件。但奇怪的是,“#ERROR”仍然出现...... 发布您的代码可以帮助我们帮助您。你能澄清一下控件是绑定的还是未绑定的? 【参考方案1】:感谢@Wayne G. Dunny 与我的有益讨论。这有助于我找出当前实现的问题以及可能的解决方案。
这是我的未绑定文本框 text_root_cause_field 中显示#ERROR 的原因。此文本框绑定到我的子表单的加载事件中的一个函数调用,其中我的子表单记录源中的另外两个字段作为参数。这最初会在 text_root_cause_field 文本框中给我一个值,因为我的子表单的记录源已在表单属性中设置为我的查询之一 Shipment_cycle_time。
在程序遇到我的主窗体的打开事件之前,这可以正常工作。在 Open Event 中,我将子表单的记录源设置为 NULL,因为我不想在表单启动时显示任何数据。由于主窗体的打开事件发生在在子窗体的加载事件之后,因此子窗体中不再存在任何字段。所以我的 text_root_cause_field 绑定的函数是从两个不存在的字段中检索值。这给出了#ERROR。
找出原因后,解决方法就很简单了。我可以将我的函数的 SQL 输出包含到我的子表单记录源的 SQL 中。所以子表单的记录源就变成了
SELECT s.*, (SELECT TOP 1 root_cause FROM Shipment_Remark as r
WHERE r.plant = s.plant
AND r.shipment_no = s.shipment_no
ORDER BY r.update_time DESC) as root_cause
FROM shipment_cycle_time AS s WHERE TRUE
除了shipping_cycle_time查询中的所有字段外,另一个字段root_cause是根据两个shipping_cycle_time字段从不同的表中选择的。这与从函数返回的内容完全相同。我没有使用函数,而是将文本框 text_root_cause_field 的 controlsource 设置为 root_cause 字段。
问题解决了!
【讨论】:
【参考方案2】:既然您在 Form_Load 事件中设置值,为什么不检查是否有零记录,如果是,则不要设置该值 - 让它为空。
【讨论】:
我添加了那张支票,但仍然没有运气。我相信错误是由于绑定操作本身,而不是绑定结果。请查看我粘贴的代码。 由于子表单记录集是在加载事件之前填充的,我认为您应该删除子表单记录源,然后在主加载事件中取消绑定或删除文本字段的源。然后如果记录集有记录提醒或设置来源。 我不确定我是否正确理解了您的想法。如果我没有在子表单的加载事件中绑定文本字段,我可以使用主表单中的哪个事件来进行绑定? 您可以通过 vba 代码进行绑定。但仅当 Rs 已填充时。我建议默认取消绑定子表单中的 rs 和 txt。然后如果 rs 有记录修复你的文本框 我在子表单的加载事件中添加了以下检查。Private Sub Form_Load() Debug.Print Me.RecordSource If Me.RecordSource <> "" Then If [plant] <> "" And [shipment_no] <> "" Then Me.text_root_cause_field.ControlSource = "=getLatestRemark([plant], [shipment_no])" End If End If End Sub
但是,这次我得到了#Name?在填充 RS 之前加载子表单时显示在我的未绑定文本字段中以上是关于访问子窗体未绑定控件#Error的主要内容,如果未能解决你的问题,请参考以下文章