报表工具的动态数据源实现

来源:互联网 发布:mysql的端口号 编辑:程序博客网 时间:2024/06/05 16:38


    博客分类: 

  有时候我们需要用参数动态指定数据源,或将多数据源连接为单数据源,或向子报表、table控件动态传入数据源名。对于此类需求,报表工具经常要借助高级语言实现或牺牲安全性以降低复杂度,尤其是BIRT、Jasper等单源报表。

  使用免费的集算器可以弥补这一不足。集算器封装了丰富的结构化计算函数,支持动态解析表达式,支持多数据源混合计算,书写简单脚本就能实现动态数据源。集算器还提供了简单易用的JDBC接口,报表工具可将集算器脚本文件当做数据库存储过程执行,传入参数并用JDBC获得返回结果。

  集算器与报表工具的集成结构如下:

伦理片 http://www.dotdy.com/


 

  下面举例说明集算器根据参数动态切换数据源的基本过程:

  数据源myDB1和oraDB分别指向不同的数据库,两库中有相同结构的表sOrder,报表需要根据参数动态连接数据源,查询并展现sOrder中金额大于1000的订单。

  myDB1中sOrder部分数据如下:


 

  oraDB中sOrder部分数据如下:


 

  集算器代码:=${pSource}.query(“select * from sOrder where Amount>?”,pAmount)

  pSource、pAmount都是报表参数,其中pSource代表数据源名,${…}表示将字符串或字符串变量解析为表达式,pAmount代表订单金额。

  当pSource=”myDB1”时,A1的计算结果如下:


 

  当pSource=”oraDB”时,A1的计算结果如下


 

  报表工具可用JDBC的方式调用集算器脚本,就像调用普通数据库中的存储过程,形如:call 脚本文件名(参数1…参数N)。集算器的返回结果会以普通数据集的形式参与报表计算。
  作为专业的报表数据源工具,集算器还可以实现更多的计算,下面分别举例。

多源数据join后计算

  Sales是mysql数据库中的表,存储着多名销售员每天的多个订单,其中字段SellerId是销售员编号。emp是mssql数据库中的表,存储着销售员信息,其中字段EId是销售员编号。现在需要在报表中展现:订单编号、日期、金额、销售员名字、部门名称,条件是:订单日期在最近N天(比如30天)或者订单属于某几个受关注的部门(比如Markeding和Finance)。部分源数据如下:

  库表sales


 

  库表emp


 

  集算器代码:


 

  A1,A2:查询数据库,myDB1和myDB2分别直向mysql和mssql。

  A3:将A1中的SellerId字段替换成A2中对应的记录,关联字段为EId。A3的计算结果如下(蓝色字体表示该数据项包含下级成员):


 

  当A2中找不到对应的记录时,函数switch默认保留A1中记录,对应的SellerId显示为空,效果类似于左连接。如果想进行内连接,应当使用选项@i,形如:

影音先锋电影 http://www.iskdy.com/

  A4:对关联结果进行过滤,第1个条件是:订单日期在最近N天(对应参数days),表达式为。第2个条件是:订单属于某几个受关注的部门(对应参数depts),表达式是。运算符||表示逻辑关系“或”。

  函数after可以算出相对时间,函数array可以按分隔符将字符串拆分为集合。函数pos可以找出成员在集合中的位置。SellerId.Dept表示SellerId字段对应的记录的Dept字段。

  

0 0
原创粉丝点击