2017-04-19 40 views
0

我有一个SQL Server的Access客户端,它使用带有多个子窗体的选项卡式窗体。基本上,在主窗体上选择了一个产品,然后该标签可以访问编辑/插入存储在不同相关表中的产品的不同属性(选项,颜色,styes等)。每个子表单使用它自己的记录源,但是会同步到产品编号上的主窗体。MS Access选项卡式多个OnCurrent发射

所以,我有一个子窗体中的组合框,将其称为“选项”,我想填充来自使用“where”子句中的产品编号的查询的数据。这就是我需要做的。我如何做到这一点是使用Options子窗体的OnCurrent事件来设置RowSource等于一个SQL字符串。这很有效,但是... OnCurrent事件每次在主窗体中选择新产品时触发,无论Options子窗体表单是否具有焦点。然后,当选项获得焦点时,它再次启动。然后,由于选项使用数据表布局,因此即使记录源不需要更改,它也会触发所选的每个记录。

虽然这可以工作,但是很多不必要的数据被来回发送到(非常)远程的SQL Server。那么,是否有另一个事件可以用于整个子表单,理想情况下只是触发一次,而不是子表单中的每条记录?我尝试了焦点,但从未解雇。当选择新产品时(当然),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 

感谢您的帮助。

吉姆

+0

因此,您正在设置组合框的RowSource而非叙述中所述的RecordSource?为什么使用代码来设置组合框的RowSource?为什么不在RowSource属性中使用SQL语句,然后在组合框GotFocus事件中执行代码就会执行RowSource的Requery? – June7

+0

嗯,过滤器(where子句)必须动态设置,因为它对于当前正在编辑的每个产品都会发生变化。并且不会使用GotFocus作为组合框重新选择的每个记录? (这是一个网格视图,所以组合框在每一行都被复制。) – user3091705

+0

组合框RowSource SQL语句WHERE子句将引用ProductNumber,因此它将是动态的。 Seth的回答是沿着这些线,除了我会使用组合框GotFocus事件触发重新查询。他确实对主要形式的依赖很好。通常,主要和从属组合框的形式相同。另外,带有查询显示别名值的组合框在连续数据表或数据表格中不起作用。 – June7

回答

0

我相信这样做的正确方法是不能动态地改变组合框的行来源。相反,使用查询设计器将rowsource设置为查询,并使查询从“主窗体”中读取值,就像示例代码中所示... Forms![产品主窗体]!ProductNumber。

然后,我会使用MAIN FORMs AfterUpdate事件触发刷新组合框。它会像MainForm!MySubForm.Form(“mycombobox”).requery。 (我可能没有完全正确的语法...我的访问语法是生锈的。)

顺便说一句,我不喜欢我自己的答案。原因在于您正在对子窗体和其父窗体之间的依赖关系进行硬编码。如果你永远不会在其他任何地方使用该子表单,这可能会很好。为了解决这个问题,一些Access开发人员使用一个隐藏窗体,该窗体具有从主窗体的更新事件后设置的文本框。然后,查询更新为引用您为此表单创建的隐藏窗体的文本框。

还有其他方法可以做到这一点(例如公共功能)。但是,对不起,这不是你要求的。我的第一种方法将工作。但是,第一次需要重新使用该子表单时,您需要重构,隐藏表单解决方案运行良好。