从不同的记录集中动态分配控制源
Posted
技术标签:
【中文标题】从不同的记录集中动态分配控制源【英文标题】:Assign control source dynamically from a different recordset 【发布时间】:2014-01-16 10:10:09 【问题描述】:我的访问权限中有以下 VBA 代码。
Dim subform As Object
Dim formFilter As String
formFilter = "..." 'a SQL statement
Set subform = Me!my_subform.Form
subform.RecordSource = formFilter
subform.field1.ControlSource = "f1"
subform.field2.ControlSource = "f2"
subform.field3.ControlSource = "f3"
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT TOP 1 f4 FROM my_table " _
& "WHERE tableF1= '" & [f1] & "' AND tableF2 = '" & [f2] & "' " _
& "ORDER BY tableF5 DESC")
subform.field4.ControlSource = rs(0)
我首先将子表单中的前 3 个字段绑定到我的记录源的字段。然后我需要将第 4 个字段绑定到不同的记录集。此记录集必须引用我的子表单的前 2 个字段。
但是,我收到了运行时错误 2465。Access 无法引用我的 OpenRecordSet 语句的字段 [f1] 和 [f2]。
我应该如何解决这个问题?
我在数据表视图中使用此表单。所以我需要引用的不是 field1 和 field2 的单个值,而是必须链接整个记录列。
非常感谢。
【问题讨论】:
您不能将一个表单绑定到两个不同的记录集。您应该能够使用 SQL 语句中的表 JOIN 将表单绑定到访问两个不同表的单个记录集。但请注意,在其 SQL 中使用 JOINS 的记录集通常是只读的。 @HK1。谢谢。但我不能使用 JOIN 因为我的 field4 有超过 1 条匹配记录。使用 JOIN 会给我重复的 field1、field2 和 field3。这就是为什么在我的第二个记录集中我只需要选择前 1 行。 与其在问题中添加解决方案,不如将其作为答案发布。 【参考方案1】:(从之前对问题的编辑,因为回滚了:)
显然,这种情况下的解决方案是在 subform 的 On Load
事件处理程序中使用以下代码,而不是 主窗体
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT TOP 1 f4 FROM my_table " _
& "WHERE tableF1= '" & [f1] & "' AND tableF2 = '" & [f2] & "' " _
& "ORDER BY tableF5 DESC")
subform.field4.ControlSource = rs(0)
因为 [f1] 和 [f2] 控件位于子窗体上,因此在主窗体的类模块代码中不可见。
【讨论】:
以上是关于从不同的记录集中动态分配控制源的主要内容,如果未能解决你的问题,请参考以下文章