You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选包含指定ItemGroup的SalesLines的SalesTable数据源?AX求助

嘿,我来帮你解决这个过滤销售订单的问题!你想要实现的是通过ItemGroup筛选器,只显示那些包含符合条件销售行的销售订单,对吧?之前在筛选器的modified方法里踩坑了没关系,下面给你两种可行的方案,一步步来就能搞定:

方案一:动态修改SalesTable查询添加Exists Join(推荐)

这种方式不需要额外创建对象,直接在筛选器的modified方法里动态调整查询逻辑,灵活性很高。

步骤1:准备筛选器绑定变量

在表单的类声明里定义一个用于存储筛选值的变量:

ItemGroupId filterItemGroup;

然后把你的筛选器控件的DataSource属性设置为这个表单,DataField选择刚才定义的filterItemGroup。

步骤2:编写筛选器的modified方法逻辑

在筛选器控件的modified方法里添加以下代码:

public void modified()
{
    Query                   query;
    QueryBuildDataSource    qbdsSalesTable;
    QueryBuildDataSource    qbdsSalesLine;
    QueryBuildRange         qbrItemGroup;

    super();

    // 获取SalesTable数据源的查询对象
    query = SalesTable_ds.query();
    qbdsSalesTable = query.dataSourceTable(tableNum(SalesTable));

    // 先移除已存在的SalesLine关联数据源(避免重复添加导致查询异常)
    qbdsSalesLine = qbdsSalesTable.findDataSource(tableNum(SalesLine));
    if (qbdsSalesLine)
    {
        qbdsSalesTable.removeDataSource(qbdsSalesLine);
    }

    // 如果筛选器有值,添加Exists Join关联SalesLines并过滤ItemGroup
    if (filterItemGroup)
    {
        qbdsSalesLine = qbdsSalesTable.addDataSource(tableNum(SalesLine));
        qbdsSalesLine.joinMode(JoinMode::ExistsJoin); // 只保留存在符合条件SalesLine的SalesTable记录
        qbdsSalesLine.relations(true); // 使用系统默认的SalesId关联关系

        // 添加ItemGroup的筛选范围
        qbrItemGroup = qbdsSalesLine.addRange(fieldNum(SalesLine, ItemGroupId));
        qbrItemGroup.value(filterItemGroup);
    }

    // 重新执行查询,更新网格显示
    SalesTable_ds.executeQuery();
}

代码解释

  • 先移除已有的SalesLine数据源:避免多次修改筛选器时重复添加关联,导致查询逻辑混乱。
  • JoinMode::ExistsJoin:这个是核心!它会让查询只返回那些至少有一条符合ItemGroup条件的SalesLine的SalesTable记录,完全符合你的需求。
  • 当筛选器清空时,代码会移除SalesLine的关联,回到显示所有SalesTable记录的状态。
方案二:使用自定义视图作为数据源(适合常用筛选场景)

如果这个ItemGroup筛选是你表单的常用需求,可以提前创建一个视图,把关联逻辑固化进去,后续维护更简单。

步骤1:创建自定义视图

  1. 在AOT中新建一个视图(比如命名为SalesTable_ItemGroupView)。
  2. 添加SalesTable作为主数据源,然后添加SalesLines作为子数据源。
  3. 设置SalesLines的JoinMode为ExistsJoin,并通过SalesId字段建立关联。
  4. 把SalesLine.ItemGroupId字段添加到视图的字段列表中。

步骤2:替换表单数据源

把表单原来的SalesTable数据源替换成这个自定义视图,然后将筛选器控件直接绑定到视图的ItemGroupId字段。这样不用写任何代码,系统会自动根据筛选值过滤视图数据。

注意事项
  • 确保SalesLines的JoinSource属性已经正确设置为SalesTable(你已经完成这一步,没问题)。
  • 测试时要验证边界情况:比如一个销售订单有多个不同ItemGroup的行,只要其中一个符合筛选条件,订单应该正常显示;筛选器清空时,要能显示所有订单(包括没有SalesLines的订单,如果业务需要的话)。
  • 如果你的表单有其他查询逻辑,要注意动态修改查询时不要覆盖原有条件(比如可以先保留原有范围,再添加Exists Join)。

内容的提问来源于stack exchange,提问作者Nikos Kou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:01:59