【发布时间】:2023-04-07 16:34:01
【问题描述】:
我有一个访问 SQL Server 的客户端,它使用带有多个子表单的选项卡式表单。基本上,在主窗体上选择一个产品,然后选项卡允许编辑/插入存储在不同相关表中的产品的不同属性(选项、颜色、样式等)。每个子表单都使用自己的记录源,但会同步到产品编号上的主表单。
所以,我在一个子表单中有一个组合框,称为“选项”,我想使用“where”子句中使用产品编号的查询中的数据填充该组合框。这就是我需要做的。我的做法是使用 Options 子窗体的 OnCurrent 事件将 RowSource 设置为等于 SQL 字符串。这行得通,但是......每次在主窗体中选择新产品时都会触发 OnCurrent 事件,无论选项子窗体窗体是否具有焦点。 Then it fires again when Options get the focus.然后,由于 Options 使用数据表布局,它会为每条选定的记录触发,即使记录源不需要更改。
虽然这可行,但有很多不必要的数据来回传输到(非常)远程 SQL Server。那么,是否有另一个事件可以用于整个子表单,理想情况下只触发一次,而不是用于子表单中的每条记录?我试过Got Focus,但从未成功。选择新产品时(当然)不会触发 Open 和 Load 事件。或者我应该在其他地方设置选项子表单记录源?
这是事件代码:
Private Sub Form_Current()
Dim sql As String
sql = "SELECT O.[OptionID], O.[Caption] FROM ProductOptions AS O WHERE o.[OptionTypeID] in (1,2,8,9) AND o.ProductNumber = "
sql = sql & "'" & Nz(Forms![products main form]!ProductNumber, "99test") & "'"
oidSelect1.RowSource = sql
End Sub
感谢您的帮助。
吉姆
【问题讨论】:
-
所以您设置的是组合框的 RowSource 而不是叙述中所述的 RecordSource?为什么要使用代码来设置组合框的 RowSource?为什么不在 RowSource 属性中有 SQL 语句,然后在组合框 GotFocus 事件中的代码只是对 RowSource 进行重新查询?
-
嗯,过滤器(where 子句)必须动态设置,因为它会随着当前正在编辑的每个产品而变化。并且不会使用 GotFocus 对每个选定的记录进行组合框重新查询? (这是一个网格视图,因此组合框会复制到每一行。)
-
组合框 RowSource SQL 语句 WHERE 子句将引用 ProductNumber,因此它是动态的。 Seth 的回答是这样的,除了我会使用组合框 GotFocus 事件来触发重新查询。他确实对主要形式的依赖提出了很好的观点。通常,主组合框和从属组合框采用相同的形式。此外,带有显示别名值的查找的组合框在连续表单或数据表表单上效果不佳。
-
如果ProductNumber是表单和子表单的主/外键链接,那么为什么要引用主表单,ProductNumber应该是子表单RecordSource的一部分。
-
我尝试在子表单上引用产品编号,但是在添加新记录时,它具有空值,所以是的,我必须将其存储在隐藏字段中。
标签: ms-access ms-access-2013 ms-access-2016 subform tabbed