从不同的记录集中动态分配控制源

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】:

(从之前对问题的编辑,因为回滚了:)

显然,这种情况下的解决方案是在 subformOn 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] 控件位于子窗体上,因此在主窗体的类模块代码中不可见。

【讨论】:

以上是关于从不同的记录集中动态分配控制源的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS:从 ng-repeat 动态分配控制器

动态内存

动态内存

C 内存的动态分配怎么用?有啥建议吗?内存分配中栈与堆到底有啥不同啊?

c语言分配内存方式都有哪些

2016 - 2 - 16 动态内存分配与静态内存分配