码迷,mamicode.com
首页 > 其他好文 > 详细

主子报表多数据源的处理

时间:2015-07-31 10:48:11      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:报表数据源   主子报表   多数据源   集算器   

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

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

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

  表emp

技术分享

  表sales

技术分享

  集算器代码:

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

技术分享

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

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

技术分享

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

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

技术分享

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

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

技术分享

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

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

技术分享
  需要定义两个报表参数pLow、pHigh,分别对应empEsProc.dfx中的两个参数。
  报表调用集算器的方法和调用存储过程一样。首先要定义JDBC数据源,比如esProcConn,如下图:
技术分享

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

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

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

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

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

技术分享

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

  报表模版:

技术分享
  报表预览:
技术分享

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

主子报表多数据源的处理

标签:报表数据源   主子报表   多数据源   集算器   

原文地址:http://blog.csdn.net/u012388497/article/details/47164785

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!