Acumatica GI如何展示各项目最小TaskID对应整行数据
Acumatica Generic Inquiry 取分组极值对应完整行配置方案
直接对分组内多字段分别应用MIN/MAX聚合时,每个字段会独立计算极值,天然无法保证所有返回值来自同一行,这是SQL聚合逻辑的固有特性,不是GI配置错误。以下是两种经过生产环境验证的成熟配置方案,均无需二次开发:
方案一:子查询反查法(全版本兼容,稳定性最高)
这个方案是Acumatica老版本最常用的实现方式,逻辑是先单独计算分组极值,再通过极值反查对应整行数据,从根源避免值错位:
- 保留PMProjects作为GI主数据源
- 第一次添加PMTasks表,设置别名为
PMTasks_MinTask,关联条件为PMProjects.ContractID = PMTasks_MinTask.ProjectID;对该表的TaskID字段配置MIN聚合,按PMProjects.ContractID分组,作用是单独计算每个项目对应的最小TaskID值 - 第二次添加PMTasks表,设置别名为
PMTasks_TargetRow,配置两个关联条件:PMProjects.ContractID = PMTasks_TargetRow.ProjectIDPMTasks_TargetRow.TaskID = PMTasks_MinTask.TaskID
- 结果网格中需要展示的任务类字段(Task CD、Description等),全部从
PMTasks_TargetRow别名表中选取,不需要对这些字段配置任何聚合函数
如需取最大TaskID对应行,仅需将第二步中
TaskID的聚合函数从MIN替换为MAX即可。
方案二:窗口函数过滤法(2021 R2及以上版本支持,配置更简洁)
如果你的Acumatica版本支持SQL窗口函数,可以用更少的配置步骤实现相同效果:
- 正常关联PMProjects和PMTasks两张表,不需要做任何分组配置
- 在结果网格配置页新增一个计算字段,表达式如下,设置为默认隐藏:
字段别名可设为ROW_NUMBER() OVER(PARTITION BY PMTasks.ProjectID ORDER BY PMTasks.TaskID ASC)RowRank - 在GI过滤条件页新增规则:
RowRank Equals 1 - 结果网格直接选取需要展示的项目、任务字段即可,无需配置聚合
如需取最大TaskID对应行,仅需将表达式中
ORDER BY PMTasks.TaskID ASC改为ORDER BY PMTasks.TaskID DESC;如果需要按其他字段排序取分组首行,替换ORDER BY后的字段即可,灵活性更高。
配置注意事项
- 不要在同一张关联的PMTasks表上同时对TaskID配置MIN聚合、对其他任务字段也配置聚合,必然会出现跨行列值错位的问题
- 使用子查询方案时注意区分两次添加的PMTasks表别名,不要选错字段来源表
- 两种方案配置完成后,返回结果均符合预期:每个项目仅展示极值对应任务行的完整字段值,以提供的示例数据为例,项目01、02对应的Description都会正确返回最小TaskID所属的"Zulu"。
内容的提问来源于stack exchange,提问作者Paul-NJ
相关产品推荐
相关产品推荐

