如何在JasperReports分组后的子数据集中按nameLast字段排序?
解决JasperReports分组后排序问题
场景1:分组内记录按nameLast排序
如果你的需求是每个pId分组内的记录按nameLast字段排序,可以直接在分组标签<group>内部添加<sortField>,指定组内的排序规则:
修改后的subDataset配置:
<subDataset name="currentDuesDataSet" uuid="c3f7bf4a-f29f-4ea2-82ec-16e32eb83f03"> <field name="cId" class="java.lang.String"/> <field name="mId" class="java.lang.Integer"/> <field name="pId" class="java.lang.Integer"/> <field name="nameFirst" class="java.lang.String"/> <field name="chaser" class="java.lang.String"/> <field name="pName" class="java.lang.String"/> <field name="nameLast" class="java.lang.String"/> <field name="totalPremium" class="java.lang.Double"/> <variable name="totalPremiumCost" class="java.lang.Double" resetType="Group" resetGroup="RECORDS_PER_PURCHASER" calculation="Sum"> <variableExpression><![CDATA[$F{totalPremium}]]></variableExpression> </variable> <group name="RECORDS_PER_PURCHASER"> <groupExpression><![CDATA[$F{pId}]]></groupExpression> <!-- 组内按nameLast升序排序,添加descending="true"可改为降序 --> <sortField name="nameLast" /> </group> </subDataset>
这种方式会先按pId完成分组,再对每个分组内的记录按nameLast排序,完全匹配你“先分组再排序”的需求。
场景2:分组后的组按nameLast排序
如果你的需求是各个pId分组之间按nameLast字段排序(即整个报表的分组顺序由nameLast决定),由于JasperReports的分组依赖于数据集的预排序,直接在报表内实现“先分组再排组”比较困难,可采用以下两种方案:
方案1:Java层预处理数据源
在传递$F{list}给报表前,先在Java代码中完成分组和组排序:
- 将原始列表按
pId分组,计算每个组的totalPremiumCost和对应的nameLast; - 将分组后的列表按
nameLast排序; - 将处理后的分组列表作为数据源传递给报表,此时报表无需再配置分组,直接遍历分组后的列表即可。
方案2:报表内预排序实现组排序
如果无法修改数据源,可通过调整数据集的全局排序规则,让分组后的顺序符合nameLast排序:
在subDataset的根级别添加全局排序字段,先按nameLast排序,再按pId排序,确保相同pId的记录仍能被正确分组,同时组的顺序由nameLast决定:
<subDataset name="currentDuesDataSet" uuid="c3f7bf4a-f29f-4ea2-82ec-16e32eb83f03"> <!-- 全局排序:先按nameLast排序,再按pId排序 --> <sortField name="nameLast" /> <sortField name="pId" /> <field name="cId" class="java.lang.String"/> <field name="mId" class="java.lang.Integer"/> <field name="pId" class="java.lang.Integer"/> <field name="nameFirst" class="java.lang.String"/> <field name="chaser" class="java.lang.String"/> <field name="pName" class="java.lang.String"/> <field name="nameLast" class="java.lang.String"/> <field name="totalPremium" class="java.lang.Double"/> <variable name="totalPremiumCost" class="java.lang.Double" resetType="Group" resetGroup="RECORDS_PER_PURCHASER" calculation="Sum"> <variableExpression><![CDATA[$F{totalPremium}]]></variableExpression> </variable> <group name="RECORDS_PER_PURCHASER"> <groupExpression><![CDATA[$F{pId}]]></groupExpression> </group> </subDataset>
这种方式本质是先排序再分组,但最终呈现的分组顺序会按nameLast排列,可满足组排序的需求。
内容的提问来源于stack exchange,提问作者Tulshiram Pawde
相关产品推荐
相关产品推荐

