【问题标题】:MSAccess: Change in subform recordsource causes loss of LinkChildFields bindingMSAccess:子表单记录源中的更改导致 LinkChildFields 绑定丢失
【发布时间】:2013-05-20 08:58:09
【问题描述】:

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

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

当我希望子表单基于不同的查询(即基于不同的表)但具有与原始查询相同的唯一键(“ID”)和字段时,就会出现问题。查询都可以正常工作,并且在表单中显示它们也可以正常工作。

当我更改子表单的记录源(从 QueryA 到 QueryB)时,问题就出现了。子表单的记录是正确的(即查询结果按预期显示)-但 LinkChildFields 不再起作用:子表单不再显示查询中的相关记录-它全部显示。换句话说,表单显示整个记录集,就好像我没有设置 LinkChild / LinkMaster。

所以,MainForm中toggle控件的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 记录)......即使我只是将属性设置为我的调试告诉我它已经设置为.好像它不再开火了。

很困惑。

【问题讨论】:

  • 您是否尝试过在您的 VBA 代码中更新 Form.RecordSource 后立即重新设置 LinkChildFields 的值?
  • 是的。我什至尝试为每个查询(比如 IDa 和 IDb)添加一个额外的不同字段,并将它们用作案例的部分链接(以排除它保留原始查询中的某些内容)。它只是停止射击。

标签: vba ms-access-2010


【解决方案1】:

Access 继续做最愚蠢的事情。

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

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

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

【讨论】:

  • 很高兴听到您找到了解决方案。基本交叉表查询可能出现的一个问题是列名可以根据基础数据而改变,因此有时需要在Column Headings 属性中“硬编码”列标题查询自己。完成此操作后,Access 的其他部分将立即“知道”列名称,而无需实际运行查询(对于大型交叉表可能需要很长时间)。
  • 非常感谢。我实际上是出于纯粹的懒惰而使用交叉表:我所追求的交叉表元素仅基于两个条件的结果进行计数 - 所以我只花了大约 2 分钟来重写底层查询。与大约一天的工作相比,导致错误的是查询(而不是交叉表)!你生活和学习......
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 2011-06-08
    • 1970-01-01
    相关资源
    最近更新 更多