如何保证分组表头在相应页上重复
例题描述和简单分析
数据库中有 ORDERS 表,包含三个字段:ORDERID、CLIENT 和 AMOUNT,如下:
ORDERID |
CLIENT |
AMOUNT |
1 |
DY |
2000 |
2 |
DY |
1500 |
3 |
DY |
1000 |
4 |
DY |
2500 |
5 |
DY |
1700 |
6 |
EGH |
1600 |
7 |
EGH |
1800 |
8 |
EGH |
1200 |
9 |
EGH |
1100 |
报表展现时,需要按 CLIENT 分组后,取 ORDERID、AMOUNT 两列,每组的第一条记录为:[当前组内的 CLIENT,null],并且保证分页后,分组表头在相应页上重复。例如,当每页行数为 3 时,分页结果如下:
第一页:
ORDERID |
AMOUNT |
DY |
|
1 |
2000 |
2 |
1500 |
第二页:
ORDERID |
AMOUNT |
DY |
|
3 |
1000 |
4 |
2500 |
第三页:
ORDERID |
AMOUNT |
DY |
|
5 |
1700 |
EGH |
第四页:
ORDERID |
AMOUNT |
EGH |
|
6 |
1600 |
7 |
1800 |
第五页:
ORDERID |
AMOUNT |
EGH |
|
8 |
1200 |
9 |
1100 |
解法及简要说明
在集算器中编写脚本 p1.dfx,如下所示:
A |
|
1 |
=connect("demo") |
2 |
=A1.query@x("SELECT * FROM ORDERS ORDER BY CLIENT") |
3 |
=create(ORDERID,AMOUNT) |
4 |
>A2.run(if(A3.len()%row==0 || CLIENT!=CLIENT[-1],A3.insert(0,A2.CLIENT,null)),if(A3.len()%row==0 && A3.m(-1).AMOUNT==null,A3.insert(0,A2.CLIENT,null)),A3.insert(0,A2.ORDERID,A2.AMOUNT)) |
5 |
return A3 |
简要说明:
设脚本参数 row 为 3,是报表展现时每页的行数
A1 连接数据源名称为 demo 的数据库
A2 执行 SQL,返回查询结果所组成的序表,结束时自动关闭数据库连接
A3 创建字段名为 ORDERID,AMOUNT 的序表
A4 对 A2 的每条记录计算表达式,这里的 run 函数中有三个计算表达式,前两个为 if 函数,第三个是 insert 函数;第一个 if:当前 A3 序表的长度与脚本参数 row 取余为 0 或者当前 A2 记录的 CLIENT 与 A2 中上一条记录的 CLIENT 不相等时,则 A3 序表追加分组表头,第二个 if:当前 A3 序表的长度与脚本参数 row 取余为 0 并且当前 A3 序表的最后一条记录的 AMOUNT 为 null 时,则 A3 序表追加分组表头,把当前 A2 记录的 ORDERID 和 AMOUNT 追加至 A3 序表
A5 返回 A3
BIRT集成这段代码的方法可参考:《BIRT如何调用 SPL 脚本》。
https://www.eclipse.org/forums/index.php/t/249387/
英文版