1

我有一个问题,我完全被难住了。或者更确切地说,我有一个混乱的解决方法,我不明白为什么我想做的事情不起作用:

我有一个主窗体/子窗体嵌套。子表单由主/子字段链接(两种表单都不可编辑 - 所以我直接使用记录源字段而不是单独的控件)。子窗体是连续窗体;所以当当前记录发生变化时,子窗体会在主窗体中显示与主窗体相关的记录。子表单基于查询——没有应用参数或过滤器——查询完全根据需要显示记录集。这一切都很完美(因为当主窗体的记录发生变化时,相关的子窗体记录也是如此)。

当我希望子表单基于不同的查询(即基于不同的表)但具有与原始查询相同的唯一键(“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 并在记录源更新之后重置(同样的问题)。奇怪的是,如果我更新主窗体中的 linkchildfield 属性(在当前事件中),那么它会起作用并且似乎会触发。所以,

Debug.print Me!Subform.LinkChildFields

正确返回“ID”。我能让它着火的唯一方法是编码。

Me!Subform.LinkChildFields = "ID"

进入 Mainform 的 Current 事件(即,每次 MainForm 记录更改时,都会显示正确的 QueryB 记录)......即使我只是将属性设置为我的调试告诉我它已经设置为。就好像它不再燃烧一样。

很困惑。

4

2 回答 2

2

Access 继续做最愚蠢的事情。

根本与表单设置无关。基础查询 (QueryB) 基于交叉表查询。虽然查询独立于表单工作正常(包括直接使用查询作为表单记录源时),但它显然不喜欢使用其中一个字段的产品作为唯一键(即使它是相同的格式类型和分组/ 行而不是一个交叉表字段)。

我将查询的交叉表部分更改为分组查询(使用 IIF 和 Sum 手动创建与交叉表等效的字段值),表单现在可以正常工作。

我的经验教训 - 不要使用交叉表查询!为红鲱鱼道歉。

于 2013-05-20T11:39:20.027 回答
0

Surferosa 为迟到的回复道歉,我只是在遇到与您类似的问题时才找到此线程。我不确定 Crosstab 查询是您问题的原因。我可以将 LinkMasterFields 设置为列名或控件名。我只能将 LinkChildFields 设置为列名,将其设置为控件名称不起作用。哎哟。您可以在设计视图中或通过 VBA 更改子窗体控件中的 LinkChildFields,但在许多情况下,即使 Access 显示新值,它也会继续使用以前的值。对于记录源是表或简单的两表查询的子表单来说,这是正确的。我没有时间或耐心进一步描述这个问题。对不起 !我的解决方案是将子表单控件中的 LinkChildFields 设置为一个值,例如“ID” 然后在我的不同子表单使用的每个记录源中创建一个具有该名称的别名。那么你只需要在切换子表单时更改Source Object即可。希望这可以帮助 !乙肝

于 2013-06-14T16:10:06.110 回答