最近用ireport5.0做报表界面的展示,用到了很多分组以及分组里面嵌套分组的情况,做一下总结。
具体分组的需求如下:
“分组”:
提供两个组合框控件,选择项都为“全部”、“省份”、“城市”,两个组合框控件互控关系:
1、某个组合框选择“全部”时,另一个组合框的选择项为“全部”、“省份”、“城市”
2、某个组合框选择“省份”时,另一个组合框的选择项为“全部”、“城市”
3、某个组合框选择“城市”时,另一个组合框的选择项为“全部”、“省份”
报表呈现的控制:
选择了“省份”时,报表中“省份”字段不在表格中显示,而在组的标题处显示,同理,选择了“ 城市”时,报表中“ 城市”字段不在表格中显示,而在组的标题处显示。
需求分析:在一张ireport报表界面中要实现按省份分组,城市分组,省份+城市分组,城市+省份分组,不分组这五种情况。
思路:通过在ireport报表中定义参数,根据参数的值来进行动态分组即分组条件是动态的,根据条件来判断显示那个分组的表头和表尾。
具体:在报表中定义2个参数pamCondition1类型Stirng,pamCondition2类型String省略为p1,p2
分组情况如:
1. p1=0,p2=0 不分组;
2. p1=1,p2=0或p1=0,p2=1 省份分组;
3.p1=2,p2=0或p1=0,p2=2 城市分组;
4.p1=1,p2=2 省份+城市分组;
5.p1=2,p2=1 城市+省份分组;
a.首先考虑不分组的情况,在detail1和Column Header拉入你要显示的字段名及字段循环的值,选中detail1和Column Header栏,在Print When Expression中加入显示条件
new Boolean($P{pamCondition1}.equals( "0" ) && $P{pamCondition2}.equals( "0" )) 即满足p1=0,p2=0时不分组
b.建立分组名report1
分组条件
new Boolean(
($P{pamCondition1}.equals( "0" ) && $P{pamCondition2}.equals( "1" ))
|| ($P{pamCondition1}.equals( "1" ) && $P{pamCondition2}.equals( "2" ))
|| ($P{pamCondition1}.equals( "1" ) && $P{pamCondition2}.equals( "0" ))
)?$F{province}:$F{city} 条件成立就按省份分组,否则按城市分组
在report1 Group Header1中加入要显示的列名,新建detail2加入你要显示的列值。
在report1 Group Header1 ,detail2,report1 Group Foot1的Print When Expression中加入显示条件
new Boolean(
($P{pamCondition1}.equals( "0" ) && $P{pamCondition2}.equals( "1" ))
|| ($P{pamCondition1}.equals( "1" ) && $P{pamCondition2}.equals( "2" ))
|| ($P{pamCondition1}.equals( "1" ) && $P{pamCondition2}.equals( "0" ))
) 即report1 Group Header1 ,detail2,report1 Group Foot1做为一个整体用来显示省份分组的情况,在满足条件的情况下才显示。
同理按城市分组只需要为report1新增加一个分组头report1 Group Header2同于显示列名,detail3显示列值,report1 Group Foot2用于显示分组统计结果,
分组条件是report1的分组条件,显示条件是:
new Boolean(
($P{pamCondition1}.equals( "0" ) && $P{pamCondition2}.equals( "2" ))
|| ($P{pamCondition1}.equals( "2" ) && $P{pamCondition2}.equals( "1" ))
|| ($P{pamCondition1}.equals( "2" ) && $P{pamCondition2}.equals( "0" ))
) 即report1 Group Header2 ,detail3,report1 Group Foot2做为一个整体用来显示城市分组的情况,在满足条件的情况下才显示。
c.建立分组repprt2
分组条件
new Boolean(
$P{pamCondition1}.equals( "1" ) && $P{pamCondition2}.equals( "2" )
)?$F{city}:$F{province}
report2 Group Footer1的显示条件是:
new Boolean(
$P{pamCondition1}.equals( "1" ) && $P{pamCondition2}.equals( "2" )
) 即 report Group Header1 ,detail2,report2 Group Footer1 是用于显示省份+城市分组的结果。
为report2新建一个分组尾,report2 Group Footer2 显示条件
new Boolean(
$P{pamCondition1}.equals( "2" ) && $P{pamCondition2}.equals( "1" )
) 即 report Group Header2 ,detail3,report2 Group Footer2 是用于显示城市+省份分组的结果。