如何保证分组表头在相应页上重复

例题描述和简单分析

数据库中有 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/