用Jasper report实现横向分栏报表

Jasper或BIRT等报表工具通常只支持纵向分栏,很难实现记录横向摆放并分栏的布局,比如下面的报表。

集算器具有结构化强计算引擎,集成简单,可以协助报表工具方便地实现此类需求。下面通过一个例子来说明横向分栏的实现过程。

库表emp存储着员工信息,EId是员工编号。报表需要按编号顺序依次显示员工编号、姓名、部门,数据横向分三栏,条件为编号的起止区间。部分源数据如下:

下面用集算器将原来的3字段数据转为9字段,代码如下:

A1=myDB1.query(“select EId,Name,Dept from emp where EId>=? and EId<=? order by EId “,begin,end)

这句代码用SQL语句从数据库查询数据,begin、end是来自报表的参数,表示员工编号起止区间。当begin=4、end=20时,A1的计算结果如下:

A2=A1.step(3,1)

这句代码每隔3条记录从A1取出第1条,组成新的二维表。函数step的第1个参数是跨度,第2个参数是起始位置,还有第3个参数:从起始位置取出的条数。这里省略了第3个参数。A2计算结果如下:

B2、C2以此类推。由于B2、C2可能比A2少一条记录,因此需要在末尾追加一条空记录。运算符“|”表示将两个集合纵向合并。当begin=4、end=20时,A2、B2、C2的计算结果依次如下:

A3=A2.derive(B2(#).EId:EId2,B2(#).Name:Name2,B2(#).Dept:Dept2,C2(#).EId:EId3,C2(#).Name:Name3, C2(#).Dept:Dept3)

这句代码将B2、C2横向拼接在A2上。函数derive表示追加新列,可以追加多个,其中B2(#).EId:EId2是第1个新列的表达式,符号“#”表示A2中每条记录的行号,“B2(#).EId”表示取出B2中第#条记录的EId字段,“:EId2”表示重命名为EId2。加入6个新字段后,A3就是报表需要的最终数据,如下:

result A3

这句代码将A3返回给报表工具。集算器对外提供JDBC接口,报表工具会将集算器识别为普通数据库,集成方案请参考相关文档。

接下来以JasperReport为例设计一张简单报表,模板如下:

需要定义两个报表参数pbegin、pend,分别对应集算器中的两个参数。

报表调用集算器的方法和调用存储过程一样,,比如将本脚本保存为horizontalColumn.dfx,则在JasperReport的SQL设计器中可以用call horizontalColumn($P{pbegin},$P{pend})来调用。

版权声明:本文为博主原创文章,未经博主允许不得转载。

生气是拿别人做错的事来惩罚自己

用Jasper report实现横向分栏报表

相关文章:

你感兴趣的文章:

标签云: