ireport字段如何做多条件判断_集算器助⼒ireport
在使⽤ Jasper 报表⼯具制作报表时,常常会遇到数据来⾃多个数据源的情况,通常的做法是使⽤主⼦报表或者使⽤javabean作为数据源。使⽤主⼦报表通常会增加报表设计的复杂度,⽽使⽤javabean做数据源,则需要⼀个javabean类来⽀持,并且为了在设计报表时能够看到数据,还要为ireport提供⼀个静态⽅法,该⽅法⽤于返回上⾯定义javabean的⼀个结果集。
javabean是干什么的显然,上⾯这两种办法都不太⽅便,本⽂将提供⼀种更加简便的⽅法,那就是通过集算器来解决ireport中的多数据源问题,并进⼀步提⾼ireport的性能。我们将以JasperReport5.6.0 开发环境为例进⾏介绍。
ireport 中如何使⽤多数据源
报表项⽬中,常常会出现报表源数据来⾃不同数据库的情况,例如同⼀应⽤系统的数据库负载太⼤,不得已分成多个数据库,就像是最常见的销售系统数据分成当前库和历史库,⼀部分数据存于数据库⼀部分数据存于⽂件等。
在多数据源的数据库类型⽅⾯,报表⼯具可能连接同样类型的数据库,⽐如都是mysql或者 oracle;也可能是不同的类型,如txt、csv或者Excel等。
我们的例⼦中,报表数据⼀部分来⾃mysql数据库,⼀部分来⾃⽂本⽂件。
其中,mysql数据库的employee表存储EID为1-100000的数据,内容如下:
⽽⽂件中存储EID为100001-101000的数据,内容如下:
我们的任务是在ireport中制作⼀张报表,查看employee表和⽂件合并后的所有数据。这⼀需求通过集算器协助 ireport可以轻松实现。集算器使⽤我们称之为结构化处理语⾔(Structured Process Language,简称SPL),具体的SPL代码如下:
A1:创建数据源连接,连接mysql数据源。
A2:在mysql数据源中查询employee表中的数据,并返回查询结果。
A3:读取⽂件的内容。
A4:合并A2和A3数据。
A4:将A4合并后的结果返回给报表。
为了在报表中呈现计算结果,我们需要将以上 SPL 代码存为⽂件 employee.dfx,然后就可以利⽤集算器对外提供的 JDBC 接⼝调⽤这个脚本了。
在报表⼯具中通过建⽴ JDBC 数据源引⼊集算器脚本的⽅法和调⽤存储过程⼀样,在 Jasper 的 SQL 设计器中可以⽤call employee()来调⽤。具体步骤在《JasperReport 调⽤ SPL 脚本》⼀⽂中有详细的描述。
然后,我们可以在ireport 中设计⼀个最简单的报表employee.jrxml,模板如下:
预览后可以直接看到报表结果了:
显然,这个过程相⽐传统的主⼦报表或者javabean⽅法要简单不少,更重要的是,计算逻辑⾮常清晰,集成⽅式也⼏乎没有任何学习成本。
性能优化
在解决了基本的功能需求后,我们还可以进⼀步将焦点关注到性能⽅⾯。报表项⽬中,常常需要将多个表连接查询,在这些被连接的表中,可能会包含海量的数据。例如:将雇员表和订单表通过共有字段员⼯编号连接起来,以便查看某些订单的销售⼈员的信息。显然,订单表会随着时间的推移不断增长,最终带来严重的系统负担。
下⾯例⼦中的报表数据⼀部分来⾃mysql数据库的employee表,⼀部分来⾃mysql数据库的sales表。
其中,employee表存储EID为1-3000000的雇员数据,内容如下:
⽽订单数据sales表则存储了76万条数据,⽽且持续增加。其中的数据内容样例如下:
为了实现连接查询,我们在ireport 中设计⼀个最简单的报表mysql_join.jrxml,模板如下:
⾸先我们看⼀下传统做法的表现。我们需要查询早于2015-04-01,由EID⼩于1000001的雇员产⽣的销售数据,SQL 语句如下:
select sales.OID,sales.Date,sales.EID,sales.Amount,employee.Name from sales join employee on sales.EID=employee.EID where sales.Date<'2015-04-01点击预览,在我们的测试环境下,101s后展现计算结果:
接下来,我们看看⽤集算器jdbc的运⾏效果。将上边的报表另存为esproc_join.jrxml。
然后编写如下的SPL代码:
A1:创建数据源连接,连接mysql数据源。
A2:查询sales表中Date早于2015-04-01的数据,将结果返回成游标。
A3:查询employee表中EID⼩于1000001的EID列和Name列的数据。
A4:游标A2与序表A3外键式连接。
A5:将游标的结果返回给报表。
接下来和前⼀个例⼦⼀样,将以上 SPL 代码存为⽂件esproc_join.dfx,并在数据源中定义SQL:
call esproc_join()
现在,我们点击预览,在同样的测试环境下,14s后就得到了完全相同的计算结果。
可见,使⽤集算器在简化了ireport访问多数据源的同时,还可以⼤⼤提⾼ireport的性能。本⽂中的例⼦只是集算器中⼀些简单的应⽤。事实上,基于集算器的灵活性,使⽤集算器提⾼性能的办法有很多,包括并⾏取数、可控缓存、控制SQL执⾏路径、减少隐藏格、引⼊数据计算层等等。更多更⾼级的使⽤快来乾学院看看吧!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。