多数据源动态关联报表的制作(birt为例)
2015-07-21 17:01
330 查看
使用Jasper或BIRT等报表工具时,常会碰到一些非常规的统计,用报表工具本身或SQL都难以处理,比如与主表相关的子表分布在多个数据库中,报表要展现这些数据源动态关联的结果。集算器具有结构化强计算引擎,集成简单,可以协助报表工具方便地实现此类需求。下面通过一个例子来说明多数据源动态关联的实现过程。
主表org在数据源Master中,org里每条记录对应的子表在不同的数据源中,比如org.org_id=”ORG_S”时,这条记录对应的子表是数据源S_odaURL的User表,org.org_id=”ORG_T”时,这条记录对应的子表是数据源T_odaURL中的User表。子表不止两个,名字都是User,需要和主表动态关联再呈现在报表中。逻辑上的关系如下:
![](https://img-blog.csdn.net/20150721165337089?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
集算器代码如下:
![](https://img-blog.csdn.net/20150721165515406?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
A1=Master.query("select * from org where org_id like '"+arg1+"%' ")
执行SQL,从数据源Master的org表取数据。arg1是来自报表的参数,用来过滤数据,假如arg1=”ORG”则A1的计算结果如下:
![](https://img-blog.csdn.net/20150721165537838?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
A2: for A1
依次循环A1中的记录,每次动态关联一个子表,并将关联结果合并在B2中。值得注意的是集算器用自然缩进来表示循环语句的作用范围,即B2-B7,循环体中可用A2来引用循环变量,可用#A2来引用循环计数。
B2=right(A2.org_id,1)+"_odaURL"
根据当前记录的org_id字段计算出对应子表的数据源名。第一次循环时,B2的计算结果为” S_odaURL”。
B3=connect(B2)
根据名字连接到数据源。注意,A1中的数据源Master已配置为自动连接,可以直接使用,B3中的数据源需要使用函数connect手动连接。
B4=B3.query("select * from user where org=?",A2.org_id)
查询数据源B3,按条件取出user表中的数据。
B5=B4.derive(A2.org_id:org_id,A2.org_manager:manager,A2.org_title:title)
在子表B4中新增三列,数据来自主表,重命名为org_id、manager、title。第一次循环时,B5计算结果如下:
![](https://img-blog.csdn.net/20150721165705001?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
B6=B1=B1|B5
将B5的计算结果合并到B1,运算符”|”等价于函数union。循环结束后B1会存储报表需要的完整数据,如下:
![](https://img-blog.csdn.net/20150721165734027?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
B7=B3.close()
关闭数据源连接。
A8: result B1
将B1返回给报表工具。集算器对外提供JDBC接口,报表工具会将集算器识别为普通数据库,集成方案请参考相关文档。
对于熟练的程序员,还可以使用集算器的长语句来避免循环语句,使代码更为简洁:
![](https://img-blog.csdn.net/20150721165808291?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
接下来以BIRT为例设计一张简单的分组表,模板如下:
![](https://img-blog.csdn.net/20150721165843551?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
需要定义报表参数pVar,用来对应集算器中的参数。预览后可以看到报表结果:
![](https://img-blog.csdn.net/20150721165906160?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
报表调用集算器的方法和调用存储过程一样,比如将本脚本保存为dynamicDatasource.dfx,则在BIRT的存储过程设计器中可以用call dynamicDatasource (?)来调用。
主表org在数据源Master中,org里每条记录对应的子表在不同的数据源中,比如org.org_id=”ORG_S”时,这条记录对应的子表是数据源S_odaURL的User表,org.org_id=”ORG_T”时,这条记录对应的子表是数据源T_odaURL中的User表。子表不止两个,名字都是User,需要和主表动态关联再呈现在报表中。逻辑上的关系如下:
集算器代码如下:
A1=Master.query("select * from org where org_id like '"+arg1+"%' ")
执行SQL,从数据源Master的org表取数据。arg1是来自报表的参数,用来过滤数据,假如arg1=”ORG”则A1的计算结果如下:
A2: for A1
依次循环A1中的记录,每次动态关联一个子表,并将关联结果合并在B2中。值得注意的是集算器用自然缩进来表示循环语句的作用范围,即B2-B7,循环体中可用A2来引用循环变量,可用#A2来引用循环计数。
B2=right(A2.org_id,1)+"_odaURL"
根据当前记录的org_id字段计算出对应子表的数据源名。第一次循环时,B2的计算结果为” S_odaURL”。
B3=connect(B2)
根据名字连接到数据源。注意,A1中的数据源Master已配置为自动连接,可以直接使用,B3中的数据源需要使用函数connect手动连接。
B4=B3.query("select * from user where org=?",A2.org_id)
查询数据源B3,按条件取出user表中的数据。
B5=B4.derive(A2.org_id:org_id,A2.org_manager:manager,A2.org_title:title)
在子表B4中新增三列,数据来自主表,重命名为org_id、manager、title。第一次循环时,B5计算结果如下:
B6=B1=B1|B5
将B5的计算结果合并到B1,运算符”|”等价于函数union。循环结束后B1会存储报表需要的完整数据,如下:
B7=B3.close()
关闭数据源连接。
A8: result B1
将B1返回给报表工具。集算器对外提供JDBC接口,报表工具会将集算器识别为普通数据库,集成方案请参考相关文档。
对于熟练的程序员,还可以使用集算器的长语句来避免循环语句,使代码更为简洁:
接下来以BIRT为例设计一张简单的分组表,模板如下:
需要定义报表参数pVar,用来对应集算器中的参数。预览后可以看到报表结果:
报表调用集算器的方法和调用存储过程一样,比如将本脚本保存为dynamicDatasource.dfx,则在BIRT的存储过程设计器中可以用call dynamicDatasource (?)来调用。
相关文章推荐
- android 代码实现控件之间的间距
- [Android]在代码里运行另一个程序的方法
- 肯特·贝克:改变人生的代码整理魔法
- 网页恶意代码的预防
- 高手写的Tracer-Flash代码调试类代码下载
- CSS代码缩写技巧
- 非主流Q-zOne代码代码搜集第1/2页
- CreateWeb.vbs 代码
- Lua中编译执行代码相关的函数详解
- 更有效率的css代码编写第1/3页
- 代码中到底应不应当写注释?
- SQL语言查询基础:连接查询 联合查询 代码
- 论坛头像随机变换代码
- .NET 常用功能和代码小结
- C#实现压缩HTML代码的方法
- asp编程中常用的javascript辅助代码第1/2页
- C#超实用代码段合集
- Javascript代码在页面加载时的执行顺序介绍
- JS实现图片无间断滚动代码汇总
- 我的论坛源代码(二)