需求描述:
有如下数据源:
No. | Store |
1 | 9923 |
2 | 9923 |
3 | 9923 |
4 | 9923 |
5 | 9923 |
6 | 9923 |
8 | 9923 |
9 | 9923 |
10 | 9923 |
11 | 9923 |
12 | 9923 |
怎么在不添加任何代码的情况下,在iReport中实现打印如下结果:
From | To | Store |
1 | 6 | 9923 |
8 | 12 | 9923 |
解决思路以及引申:
1.背景
在iReport中有分组的功能,按照某个Key实现分组,如下数据源:
No. | Store |
1 | 9923 |
2 | 9923 |
3 | 9923 |
4 | 9923 |
5 | 9923 |
6 | 9923 |
7 | 9923 |
8 | 9923 |
9 | 9923 |
10 | 9923 |
11 | 9923 |
12 | 9923 |
Step.1: 在iReport中定义两个Field: $F{No.}和$F{Store}(为了简化问题,只保留两个field)
Step.2: 使用iReport的分组功能【Add Report Group】,以$F{Store}作为分组依据
Step.3: 设计报表,如下图所示:
Step.4: 预览报表,如下图所示:
如果客户在前端程序中删去了其中某一条记录,例如No.为7的记录,那么数据源变为如需求描述中所示的那样:
No. | Store |
1 | 9923 |
2 | 9923 |
3 | 9923 |
4 | 9923 |
5 | 9923 |
6 | 9923 |
8 | 9923 |
9 | 9923 |
10 | 9923 |
11 | 9923 |
12 | 9923 |
如果你再次在iReport中预览的时候,你会发现预览结果和上面的一样,但是理想的结果应该是:按照顺序序列No.以1递增的记录分为一组,如果中间断开了,要另为一组,效果如下:
2.解决办法
Step.1: 和原来一样,在iReport中定义两个Field: $F{No.}和$F{Store}
Step.2: 使用iReport的分组功能【Add Report Group】,但是分组依据要变为(($F{No.} 的值 - $V{REPORT_COUNT} 的值 + 1) 再拼接$F{Store}的值),由于我在iReport中定义的$F{No.}和$F{Store}都是String类型,所以类型转换后的分组依据列的表达式应该是这样:
<pre name="code" class="java">String.valueOf(
( Integer.valueOf($F{No.}).intValue() - $V{REPORT_COUNT}.intValue()) + 1).concat($F{Store})
Step.3: 预览报表,惊喜无限
3.解释
$V{REPORT_COUNT}是iReport中自带的变量,每次有数据循环的时候自增1,最后是统计出报表中条目的总个数。
我列出以下表格,大伙们应该就知道原因了:
No. | Store | REPORT_COUNT的值 | (No. - REPORT_COUNT的值 + 1) |
1 | 9233 | 1 | 1 |
2 | 9233 | 2 | 1 |
3 | 9233 | 3 | 1 |
4 | 9233 | 4 | 1 |
5 | 9233 | 5 | 1 |
6 | 9233 | 6 | 1 |
8 | 9233 | 7 | 2 |
9 | 9233 | 8 | 2 |
10 | 9233 | 9 | 2 |
11 | 9233 | 10 | 2 |
12 | 9233 | 11 | 2 |
当然大伙们可以私下试试几个地方断开的情况,同样适用的,以下是断开No.为7和No.为10的报表预览: