通过链接数据源过滤表单的主数据源

Filter form's main datasource through the linked datasource

我有一个包含两个数据源的自定义表单。让我们说我的表单具有 Salestable 和 SalesLines 数据源更容易。

例如,我可以说我有一个与 ItemGroup edt 绑定的过滤器。

我想通过此过滤器过滤 SalesTable 数据源,以便 'show' 在与 SalesOrders 数据源连接的网格中:

'''have' 销售线的所有销售订单 saleslines.ItemGroup == somethingfromFilter''。

无论我尝试什么都失败了。有人可以帮助我吗?

仅供参考:我认为正确链接的数据源属性: SalesLine.JoinSource = 销售表 我所有的尝试都是在过滤器的修改方法中进行的。

Disclimer: 我现在没有AX2012。我已经发布了 AX2009 的屏幕截图。功能相同

先决条件:您应该有交叉引用才能使用此功能。

重现步骤:

  1. 打开表格
  2. 单击工具栏按钮 Advanced Filter/SortCtrl+F3
  3. 鼠标右键单击 Structure 树中的 Sales order table。
  4. 选择并单击 1:n,然后 Order Lines 在过滤器中添加额外的 table(您应该有交叉引用)
  5. 鼠标右键单击 Order line table 在 Structure 树中。
  6. 选择并单击 n:1Items (Item number) 以在过滤器中添加其他 table(您应该有交叉引用)
  7. 单击 Add 按钮并在范围网格中选择表格 Items 和字段 Item groups。指定一个 criteria = somethingfromFilter

请参阅下面的屏幕截图。

注意:Axapta 仅在查询中使用额外的 table。您需要更改 AOT 中的表单业务逻辑以在表单上显示额外的 tables/fields。

我可能误解了你的问题,但如果你问的是如何使用范围进行过滤,这是一项非常基本的任务。

查看 \Forms\PurchTable\Data Sources\PurchLine\Methods\init 以了解它们如何排除 "Deleted".

的行

如果您想加入 SalesLinesInventTable 以获得项目组,您可以在此处的另一个示例中查看如何修改表单的查询:

\Forms\PurchTable\Data Sources\PurchTable\Methods\linkActive

过滤代码:

I have a custom form which has two datasouces.

form has the Salestable and SalesLines datasources.

I want to filter

'all SalesOrders which 'have' saleslines with saleslines.ItemGroup == somethingfromFilter''

先决条件:自定义表单使用两个 joined 数据源。 Join type 是以下之一:Delayed、InnerJoin。

解决方案

需要修改SalesLine数据源中的Init方法

this.query().datasource(tablenum(salesLine)).addDatasource(...)
...

查看带有 init-method 和 addDatasource 文本的任何形式的示例)

我假设您在 SalesLine table 中有一个 ItemGroupId 字段。 这不标准。
此外,我假设您有一个名为 ItemGroupIdCtrl.

的过滤字段

添加辅助数据源SalesLineEx:

  • 姓名:SalesLineEx
  • Table:销售专线
  • 允许...:否
  • 加入来源:销售Table
  • 链接类型:存在加入

SalesTable 数据源中 executeQuery 模式:

public void executeQuery()
{
    SysQuery::findOrCreateRange(salesLineEx_ds.queryBuildDataSource(), fieldNum(SalesLine,ItemGroupId)).value(ItemGroupIdCtrl.text());
    salesLineEx_ds.queryBuildDataSource().enabled(ItemGroupIdCtrl.text() != '');
    super();
}

如果筛选字段有值,这将检查是否存在具有匹配字段的销售行。如果未输入任何值,则禁用过滤数据源。

您很可能希望在更改过滤器值后进行研究:

public boolean modified()
{
    boolean ret = super();
    salesTable_ds.executeQuery();
    return ret;
}