`
datamachine
  • 浏览: 156815 次
社区版块
存档分类
最新评论

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

    博客分类:
  • DB
阅读更多

   主报表和子报表(或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表。

  报表模版:



 

   报表预览:



 

  • 大小: 43 KB
  • 大小: 29.4 KB
  • 大小: 17.4 KB
  • 大小: 24 KB
  • 大小: 15.5 KB
  • 大小: 59 KB
  • 大小: 42.1 KB
  • 大小: 37.8 KB
  • 大小: 21.9 KB
  • 大小: 36.1 KB
  • 大小: 54 KB
  • 大小: 51.1 KB
  • 大小: 53 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics