如何增强开源报表或第三方报表工具(如birt、jasper)的数据源及数据处理能力

开源报表常规功能都挺全了,简单报表也都可以做,但一旦遇到复杂报表、特殊源或复杂的数据处理的情况下,解决起来非常麻烦,多数都要搞硬编码。
但实际上,现在有一种方法可以让这些像birt、jasper等开源报表工具的数据处理变的更加强大且更加的简单。

概述:运行在JVM上的SQL函数和存储过程

总所周知,有些数据库没有强大的分析函数(eg. Mysql),有些数据库没有存储过程(eg. Vertica),当遇到复杂的数据计算,往往只能通过Python,R等外部脚本来实现,但这些脚本语言和主流工程语言(Java)集成性不好,如果直接用工程语言实现类似SQL函数和存储过程的功能,经常只是针对某个计算需求编写冗长的代码,代码几乎不可复用。

另外,即便拥有强大的分析函数,实现稍复杂的逻辑其实也不算容易,比如下面这种常见的业务计算,找出“销售额占到一半的前n个客户,并按销售额从大到小排序”,在Oracle中SQL实现如下:

with A as
(selectCUSTOM,SALESAMOUNT,row_number() over (order by SALESAMOUNT) RANKING
from SALES)
select CUSTOM,SALESAMOUNT
from (select CUSTOM,SALESAMOUNT,sum(SALESAMOUNT) over (order by RANKING) AccumulativeAmount
from A)
where AccumulativeAmount>(select sum(SALESAMOUNT)/2 from SALES)
order by SALESAMOUNT desc

说明:按照销售额累计值从小到大排序,通过累计值大于“一半销售额”的条件,逆向找出占到销售额一半的客户。为了避免窗口函数在计算累计值时对销售额相同的值处理出现错误,用子查询先计算了排名。

下面是用集算器实现相同逻辑的代码:


集算器脚本

从上述代码我们可以看到,集算器利用一套简洁的语法取代了需嵌套SQL+窗口函数才能实现的逻辑,并且具有通用一致性(任何数据源代码一致)。

集算器是一套运行在JVM上专门处理结构化数据的脚本语言,类似用SQL函数和存储过程,与Java 集成可以创建可移植、功能强大和与数据库无关的计算逻辑,运行于中间层的计算逻辑和运行于数据库层的数据逻辑之间的分离,提高了应用程序的可扩展性、灵活性和可维护性。

应用场景:报表数据准备

应用结构

报表应用结构优化

集成后,集算器嵌入报表应用层,相当于本地的逻辑数据库(不需要单独服务器部署),在报表与数据源间作为报表数据准备层,完成各种复杂的计算任务。

如何集成

下面以Vertica为数据源,Birt为报表工具,描述怎样集成esProc作为数据准备层。

(一) Birt开发环境

1、 基础jar集成

集算器JDBC需要三个基础jar包,都可以在 [esProc安装目录]\esProc\lib目录下找到,分别为:

dm.jar 集算器计算引擎及JDBC驱动包
jdom.jar 解析配置文件
icu4j\_3\_4_5.jar 处理国际化

除了基础包外,还有一些为完成特定功能的jar包。如,要在集算器JDBC用其它数据库作为集算器的数据源,那么还需要相应数据库的驱动jar包,本文涉及到vertica,所以要同时增加其JDBC驱动包(以vertica9.1。0为例)

vertica-jdbc-9.1.0-0.jar vertica官网即可下载

获取到以上Jar后,将其拷贝至Birt开发环境[安装目录]\plugins\org.eclipse.birt.report.data.oda.jdbc_4.6.0.v20160607212下。

注意:标红部分,不同birt版本略有不同

2、 配置文件集成

raqsoftConfig.xml,主要包含集算器授权、脚本文件路径、其他作为集算器数据源的连接配置等。

可在[esProc安装目录]\esProc\config下找到,需复制后放置在类路径下,同样将其拷贝至Birt开发环境[安装目录]\plugins\org.eclipse.birt.report.data.oda.jdbc_4.6.0.v20160607212下。

注意:配置文件名不能改变

(二) Birt应用环境

1、 将(一)中的所有jar拷贝至应用的WEB-INF\lib下

2、 将raqsoftConfig.xml拷贝至应用的WEB-INF\classes下

例一:常规调用

1、 Vertica内Sales表字段及数据说明(通过vsql查询,本测试库有2013/14/15年数据)


Vertica

2、 编写并部署esProc脚本

(1) esProc设计器添加vertica JDBC驱动包

vertica官网下载jdbc驱动包(如,vertica-jdbc-9.1.0-0.jar),放至【esProc安装目录】\common\jdbc下

(2) 新增vertica数据源

打开设计器,Tool—Datasource connection 新增JDBC方式连接

集算器 数据源配置

点ok保存,再点connect连接

数据源配置连接

数据源名称变为粉色即表示连接成功。

(3) 编写算法脚本(文件:VerticaExternalProcedures.dfx)

File – New

增强birt从Vertica的取数计算的能力

(4) 部署脚本

将脚本文件部署到raqsoftConfig.xml配置的脚本文件主目录下。

部署集算器脚本文件

3、 esProc配置文件raqsoftConfig.xml内增加verticaLink数据源连接配置















4、 Birt开发工具内新建报表,并增加esProc数据源“esProcConnection”

birt配置集算器数据源

Driver class为”com.esproc.jdbc.InternalDriver(v1.0)”,会用到dm.jar等
Database URL为”jdbc:esproc:local://”

5、 Birt调用Vertica外部存储过程(esProc数据集)

新建“Data Sets”,选择配置的集算器数据源(esProcConnection),数据集类型选择存储过程(SQL Stored Procedure Query)


类存储过程方式调用集算器脚本文件

Next,查询脚本(Query-Query Text)输入:{call VerticaExternalProcedures()}

类存储过程方式调用集算器脚本文件语法

其中:VerticaExternalProcedures为esProc脚本文件名

Finish,预览数据(Preview Results)

birt经集算器调用vertica预览结果

此时,便看到了把esProc脚本作为Vertica外部存储过程取数辅助计

算的过程。

6、 Birt Web端呈现

以简单的网格报表为例

报表设计如下

birt报表设计

Web发布预览

birt报表结果

例二:参数调用

这里把“找出订单销售额占到一半的前n个客户,并按销售额从大到小排序”,改为要求按年查询,即“按年度查询订单销售额占到一半的前n个客户,并按销售额从大到小排序”,因此增加了参数过滤功能。

下面看下具体的改法:

1、 esProc脚本增加按年度参数及过滤功能

打开esProc设计器,Program – Parameter – Add

参数名为“qyear”(可与报表参数名不同)

集算器脚本增加参数过滤

脚本改动:

集算器增加参数后的脚本

注:A2增加条件过滤

2、 报表内增加年度参数

报表增加按年查询的入口参数,参数名为“qyear”

开发工具打开报表,Data Explorer – Report Parameter – new patameter

birt增加参数

Default value 为qyear的默认值。

3、 报表数据集增加数据集参数并与报表参数绑定

Data set内编辑VerticaExternalProcedures数据集

birt调用带参数的集算器脚本文件

Query Text 改为“{call VerticaExternalProcedures(?)}”,?为入口参数年

度,此处用占位符设置。

选 Parameters,增加数据集参数qyear并与报表参数qyear绑定。

birt报表参数与集算器脚本文件参数绑定

Preview Results,这里根据qyear默认值仅有查询2013年数据

带参数的集算器脚本返回数据在birt内

改为“2015”后

18png

4、 Web端预览

19png

查询“2015”年数据

20png

修改或url传入qyear为“2013”年后

21png

你可能感兴趣的:(如何增强开源报表或第三方报表工具(如birt、jasper)的数据源及数据处理能力)