用集算器实现跨数据库关联报表

简介:
实际应用中很多报表的数据来源于多个不同类型的 数据库,报表数据源跨数据库是报表开发中的常态。目前实现这类跨库关联报表的方式有多种,但都会存在这样那样的问题。
   使用报表工具自身多源关联功能
  现在大多数主流报表工具都支持多数据源关联,这在某些方面确实为报表用户带来了便利。然而我们也经常会遇到通过报表自身的多源关联功能很难实现一些跨库关联的报表(由于数据结构和业务本身决定)。这当然容易理解,报表工具主要是来做数据展现的,而对数据计算本身来说并不擅长。
  即使有的能实现,在报表中做跨库关联计算的效率也较低,远远不如数据库的性能,而且经常因为在实现过程中使用了大量隐藏行列进一步降低报表性能并加大内存占用。
  于是一般会采用下面的两种方式。
   将数据统一到一个数据库中
  将不同数据库的数据统一到一个数据库中,这种做法在各类应用中很常见,目的是使用数据库( SQL)强大的计算能力。然而,这种做法会增加额外的成本开销,将多个数据库中的数据统一到一个数据库中势必会占用昂贵的数据库空间,并造成该数据库数据过多、管理困难、压力增大等问题,而且还可能负担额外的数据库购买成本以及管理成本。另外,完成ETL迁移数据也是一份不小的 工作量,对实时性要求较高的报表还得用触发器方式来做ETL(一般ETL是定时的),会严重影响原数据库的性能。
   使用高级语言实现跨库关联为报表准备数据
  基于上面提到两种方式中存在的问题,有些用户使用高级语言(Java等)编程完成跨库运算,为报表自定义数据源。这种做法的优点是灵活,理论上任何运算通过程序都能完成;缺点是太难写。很多像Java这样的高级语言缺乏对集合运算的有效支持,没有相应的类库,导致完成个简单的group也要写很多(循环)代码,更不用说关联以后还要再进行分组汇总等其他运算了。
  这种情况下,使用集算器来实现跨库关联报表就是个不错的选择。
   集算器如何实现跨库关联报表?
  我们通过一个例子来看集算器是如何快速实现跨库关联报表的。
   业务描述
  企业员工每月应发工资跟员工的基本工资、考勤以及绩效有关,考勤信息来源于人力部门的考勤系统(hsql数据库),基本工资和绩效信息则存储在财务系统(mysql数据库)中。需要将这两类信息合起来计算员工的工资。
   实现步骤
   编写脚本(crossDB.dfx)完成跨库关联计算,为报表准备数据
  
  在A1、A2中通过connect分别连接hsql和mysql数据源
  在A3、A4、A5中通过query语句分别从两个数据库中取出用到的数据,此时数据已全部取出,不再需要与数据库交互,在A6、A7中关闭两个数据库连接
  在A8中使用join完成三表的连接
  在A9中计算应发工资,算法为:基本工资*(1-考勤系数+绩效系数)
  最后通过A10的result生成供报表使用的结果集
  报表调用集算器脚本完成报表展现
  集算器的类包封装成标准的JDBC,允许报表工具以类存储过程的调用方式调用集算器脚本,如本例中在报表工具中像配置数据库连接一样配置起好集算器的JDBC,然后建立存储过程数据集后使用 call crossDB()即可完成调用。
  这里以BIRT为例说明调用过程:
  1、 复制集算器JDBC驱动包到相应目录
  2、 配置报表数据源
  
  3、 设置DataSet,调用集算器脚本
  
  简单几步完成调用,BIRT即可使用集算器的计算结果直接展现输出。
  结语
  通过这个例子可以看到,集算器擅长完成跨库计算,并将计算后的结果以标准ResultSet方式返回为报表提供数据源,而报表采用类存储过程调用的方式调用集算器脚本非常简单。
  还有一个重点需要关注,就是价格。集算器是个需要付费的商业软件,好在只针对大数据的集群才收费,用作报表数据源功能是免费的,不需要增加成本就能轻松解决多数据库关联报表问题。


最新内容请见作者的GitHub页:http://qaseven.github.io/
相关文章
|
4月前
|
关系型数据库 BI 分布式数据库
PolarDB NL2BI解决方案,让你不懂SQL也能进行数据查询分析并生成BI报表
无需创建和开通资源,在预置环境中免费体验PolarDB MySQL及其NL2BI解决方案
PolarDB NL2BI解决方案,让你不懂SQL也能进行数据查询分析并生成BI报表
|
3月前
|
关系型数据库 MySQL BI
python报表自动化系列 - 通过Python使用MySQL数据库
python报表自动化系列 - 通过Python使用MySQL数据库
75 0
|
7月前
|
BI
利用 ALV 实现增删改查系列之二:仅让 ALV 报表某一列允许被编辑试读版
利用 ALV 实现增删改查系列之二:仅让 ALV 报表某一列允许被编辑试读版
54 0
|
9月前
|
BI 数据库 C++
【数据库视频】报表服务
【数据库视频】报表服务
|
BI API
利用 ALV 实现增删改查系列之一:让 ALV 报表进入可编辑状态试读版
利用 ALV 实现增删改查系列之一:让 ALV 报表进入可编辑状态试读版
195 0
|
JavaScript BI 数据库
FineReport 使用JS实现决策报表对数据库更新(自动更新,不用点击按钮)
数据库中部分表数据按照一段时间需要更新(如:每个月更新一次),这样数据库中的数据相关数据的部分值是相同的,需要让每一个月的月份更新后,数据库中其他表对应的关系也自动更新,这里介绍相关操作方法。
835 0
FineReport 使用JS实现决策报表对数据库更新(自动更新,不用点击按钮)
|
BI 数据库
一段万能的ABAP报表,能读取Netweaver上任意数据库表的内容
一段万能的ABAP报表,能读取Netweaver上任意数据库表的内容
|
监控 BI 数据库
Reporting Service 2008 “报表服务器数据库内出错。此错误可能是因连接失败、超时或数据库中磁盘空间不足而导致的”
今天遇到了两个关于Reporting Service的问题, 出现问题的环境为Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) 。具体情况请见下面描述。
1928 0