- 博客分类:
有时候我们需要用参数动态指定数据源,或将多数据源连接为单数据源,或向子报表、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字段。