如何筛选包含指定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:创建自定义视图
- 在AOT中新建一个视图(比如命名为
SalesTable_ItemGroupView)。 - 添加
SalesTable作为主数据源,然后添加SalesLines作为子数据源。 - 设置SalesLines的
JoinMode为ExistsJoin,并通过SalesId字段建立关联。 - 把
SalesLine.ItemGroupId字段添加到视图的字段列表中。
步骤2:替换表单数据源
把表单原来的SalesTable数据源替换成这个自定义视图,然后将筛选器控件直接绑定到视图的ItemGroupId字段。这样不用写任何代码,系统会自动根据筛选值过滤视图数据。
注意事项
- 确保SalesLines的
JoinSource属性已经正确设置为SalesTable(你已经完成这一步,没问题)。 - 测试时要验证边界情况:比如一个销售订单有多个不同ItemGroup的行,只要其中一个符合筛选条件,订单应该正常显示;筛选器清空时,要能显示所有订单(包括没有SalesLines的订单,如果业务需要的话)。
- 如果你的表单有其他查询逻辑,要注意动态修改查询时不要覆盖原有条件(比如可以先保留原有范围,再添加Exists Join)。
内容的提问来源于stack exchange,提问作者Nikos Kou
相关产品推荐
相关产品推荐

