我有一个问题,我完全被难过。或者更确切地说,我有一个混乱的解决方法,我不明白为什么我想做的事情不起作用:
我有一个mainform / subform嵌套。子窗体由主/子字段链接(两种形式都不可编辑 - 所以我直接使用记录源字段而不是单独的控件)。子表单是连续的形式;因此子窗体在当前记录更改时显示与mainform中的master相关的记录。子表单基于查询 - 没有应用任何参数或过滤器 - 查询完全根据需要显示记录集。这一切都完美无缺(因为当主窗体的记录发生变化时,所以要做相关的子窗体记录)。
当我希望子表单基于不同的不同查询(即基于不同的表)时出现问题 - 但是使用与原始查询相同的唯一键(“ID”)和字段。查询都可以正常工作,并在表单中显示它们。
当我更改子窗体的记录源时(因为从QueryA到QueryB),会出现问题。子表单的记录是正确的(即查询结果按预期显示) - 但LinkChildFields不再起作用:子表单不再显示查询中的相关记录 - 它将全部显示。换句话说,表单显示整个记录集,就像我没有设置LinkChild / LinkMaster一样。
因此,MainForm中切换控件的AfterUpdate事件中的代码是;
Private Sub optActRep_AfterUpdate()
Select Case Me.optActRep
Case 1
MainFormSubFormControl.Form.RecordSource = "QueryA"
Case 2
MainFormSubFormControl.Form.RecordSource = "QueryB"
End Select
我已经调试过了,属性'linkchldfields'仍然正确设置('ID')。我已经尝试在记录源更新之前将这些设置为vbNullString,并在记录源更新之后重置(同一问题)。奇怪的是,如果我更新mainform(在当前事件中)中的linkchildfield属性 - 那么它可以工作并且似乎触发了。所以,
Debug.print Me!Subform.LinkChildFields
正确返回'ID'。我能解决它的唯一方法是编码;
Me!Subform.LinkChildFields = "ID"
进入Mainform的Current事件(即每当MainForm记录发生变化时,显示正确的QueryB记录)...即使我只是将属性设置为我的调试告诉我它已经设置为。好像它不再起火了。
很困惑。
答案 0 :(得分:2)
访问继续做最好的事情。
与表单设置完全无关。基础查询(QueryB)基于交叉表查询。虽然查询工作正常独立于表单(包括直接使用查询作为表单记录源),但它显然不喜欢使用其中一个字段的产品作为唯一键(即使它是相同的格式类型和分组/ Row而不是交叉表字段。)
我将查询的交叉表部分更改为Grouped查询(使用IIF& Sum手动创建Crosstab等效字段值),表单现在可以正常工作。
我的课程学习 - 不要使用交叉表查询!为红鲱道歉。
答案 1 :(得分:0)
Surferosa 对于迟到的回复道歉,当我遇到类似你的问题时,我才发现这个帖子。我不确定交叉表查询是否是您问题的原因。 我可以将LinkMasterFields设置为列名或控件名。 我只能将LinkChildFields设置为列名,将其设置为控件名称不起作用。哎哟。 您可以在设计视图中或通过VBA更改子窗体控件中的LinkChildFields,但在许多情况下,即使显示新值,Access也会继续使用之前的值。对于其记录源是表或简单的两个表查询的子表单,情况也是如此。我没有时间或耐心来进一步描述这个问题。对不起! 我的解决方案是将子表单控件中的LinkChildFields设置为一个值,例如“ID”,然后在我的不同子表单使用的每个记录源中创建一个具有该名称的别名。然后,您只需在切换子表单时更改源对象。 希望这可以帮助 ! HB