转载

多数据源主子报表的处理(Jasper为例)

主报表和子报表(或Table表)使用不同的数据库时。JasperReport/Birt等报表工具从功能上可以处理,但在子报表中无法直接使用数据源名,需要使用显式的数据库账号、口令。可以看到这种方式存在一定的安全隐患,而且实施过程比较复杂。

集算器具有结构化强计算引擎,支持多样性数据源,集成简单,可以协助报表工具方便地实现此类需求,下面通过一个例子来说明主子报表多数据源的实现过程。

表emp在MySQL数据库中,存储员工信息,主键是EId。表sales在MSSQL中,存储员工的订单信息,字段SellerId是逻辑外键,对应emp表的EId字段。现在需要制作一张主子报表,按薪酬范围显示每位员工的订单信息,主报表数据来自表emp,子报表数据来自表sales。部分源数据如下:

表emp

多数据源主子报表的处理(Jasper为例)

表sales

多数据源主子报表的处理(Jasper为例)

集算器代码:

empEsProc.dfx(该脚本文件用于主报表)

多数据源主子报表的处理(Jasper为例)

A1:按薪酬范围查询MYSQL数据库的表emp。

myDB1是数据源名,指向MYSQL。函数query执行SQL查询,可以接收参数,low和high分别是来自报表的参数,表示薪酬范围。当low=1000,high=3000时,A1的计算结果如下:

多数据源主子报表的处理(Jasper为例)

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

salesEsProc.dfx(该脚本文件用于子报表)

多数据源主子报表的处理(Jasper为例)

A1:按员工ID从MSSQL的sales表查找相应的订单。

myDB1是数据源名,指向MSSQL。eid是报表参数,表示员工ID,用来建立主子报表的关联关系。如果eid=1,则A1的计算结果如下:

多数据源主子报表的处理(Jasper为例)

A2:将A1返回给报表工具。

接下来以JasperReport为例设计简单的主子报表,主表模板如下:

多数据源主子报表的处理(Jasper为例)

需要定义两个报表参数pLow、pHigh,分别对应empEsProc.dfx中的两个参数。

报表调用集算器的方法和调用存储过程一样。首先要定义JDBC数据源,比如esProcConn,如下图:

多数据源主子报表的处理(Jasper为例)

之后就可以在JasperReport的SQL设计器中调用empEsProc.dfx,表达式是:empEsProc $P{pLow},$P{pHigh}。

下面设计子报表,模板如下:

多数据源主子报表的处理(Jasper为例)

对于报表来说,empEsProc.dfx和salesEsProc.dfx来自于同一个数据源esProcConn,因此子报表的数据源选择“Use same connection used to fill the master report”,如下图:

多数据源主子报表的处理(Jasper为例)

类似的,在子报表中调用集算器的SQL写作:salesEsProc $P{pEId}

主子报表的关系请按照Jasper的规范设定,本案例用主表中的字段$F{EId}映射子报表的参数pEId。最终的表样如下:

多数据源主子报表的处理(Jasper为例)

Table表相当于格式简单的子报表,Jasper对两者采取了相同的处理结构,因此Table表也会遇到多数据源的问题。此类问题同样可以用集算器解决,比如把本案例的子报表改为Table表。

报表模版:

多数据源主子报表的处理(Jasper为例)

报表预览:

多数据源主子报表的处理(Jasper为例)

正文到此结束
Loading...