为什么 `FetchMode` 查询 属性 从父数据源中删除字段?

Why does the `FetchMode` query property remove fields from the parent data source?

从 AOT 打开查询 SalesTableListPage 时,您可以在字段查找中选择字段 MatchingAgreement(显示为 "Agreement Header record ID (Record-ID)")。查询 SalesUpdate、字段 MatchingAgreement 和其他几个(似乎与使用 RecId 构建关系的关系字段相关)在查找中是不可能的。

经过一些研究,我发现原因似乎是加入的 SalesLine 数据源上的 FetchMode 属性。如果是 1:n,字段不会显示在查找中。如果是 1:1,字段显示在查找中。

我没有用其他表对此进行测试,但我怀疑有相同的行为。我也只使用 AX 2012 R2 和 R3 对此进行了测试,但我怀疑其他 2012 版本中的行为相同。

为什么连接数据源的 FetchMode 在查询对话框中从父数据源中删除了一些字段?

如果两个查询字段的 dynamic 属性 都设置为 yes,那么我怀疑它与以下关系之一的属性有关:

\Data Dictionary\Tables\SalesTable\Relations\Agreement

\Data Dictionary\Tables\SalesLine\Relations\SalesTable

也许可以尝试调整它们、刷新缓存(获取 AOT 更改)、清除使用数据(打包查询可能会导致问题)和更新外部参照(高级查询使用外部参照,因此标准查询可能不需要功能)

TL;DR 查询对话框中的字段查找并不总是适用于定义与 table 关系的关系字段,其中 AutoIdentification 字段组的属性 AutoPopulate 设置为 No。它们不起作用的一种情况是当数据源与 FetchMode 1:n.

连接时

虽然 Alex K 的回答有一些有趣的建议,但就我而言,罪魁祸首是 table [=17= 的 AutoIdentification 字段组上的 AutoPopulate 属性 ].在 sys 层中,此 属性 设置为 No,如果查询中的关系为 1:1,则该组包含在查询对话框字段查找中显示的字段。如果此 属性 切换为 Yes,查找将显示字段 Agreement header record ID (Record-ID)(并且仅此字段,无论查询关系的 FetchMode 是如何定义的)。

基本上,AX 将使用来自 AutoIdentification 字段组的信息来确定在代理键 references/relations 的情况下显示在 gui 中的信息。如果字段组的AutoPopulate属性为Yes,AX会使用table的alternate key来决定要使用的字段。如果不存在备用键(table AgreementHeader 就是这种情况),AX 使用关系字段。如果 AutoPopulateNo,则使用组中定义的字段。但是如前所述,如果查询中的关系不是 1:1,则此选项不起作用(不幸的是,似乎没有实现像使用关系字段这样的回退选项)。

FetchMode    AutoPopulate     Lookup
1:1          Yes              AlternateKey (or Relation) fields
1:1          No               AutoIdentification fields
1:n          Yes              AlternateKey (or Relation) fields
1:n          No               Nothing

更新: 我又遇到了这个问题,但这次是字段SalesTaker。事实证明 AutoPopulate 属性 只是故事的一部分,因为在 table HcmWorker 上设置为 Yes 并没有解决问题。此 table(与 table AgreementHeader 不同)还具有 属性 ReplacementKey 集,AX 使用它来填充 AutoIdentification 字段组。仅在我删除 ReplacementKey 后,AutoIdentification 中不再出现任何字段,查找现在显示 "Sales taker (Record ID)"。所以底线是 AutoIdentification 字段组不能包含任何字段。