BIRT 调用 SPL 脚本

【摘要】

集算器提供了 JDBC 驱动,可以很方便的与其他报表工具进行集成,其中就包括 BIRT 报表。本文章中以 BIRT4.6.0 开发环境为例,介绍 BRIT 中如何调用 SPL。
去乾学院看个究竟:BIRT 调用 SPL 脚本

结构图如下:

imagepng


BIRT 中调用 SPL,首先需要将集算器 JDBC 集成到 BIRT 设计器中,简单来说就是,将加载集算器所需的 jar 包及配置文件放到 BRIT 对应目录中。需要注意的是,集算器 JDBC 所要求的 JDK 版本不得低于 1.8。

1. 加载驱动 jar

集算器 JDBC 类似一个不带物理表的数据库 JDBC 驱动,可以把它简单的看成是一个只有存储过程的数据库。另外,集算器 JDBC 是个完全嵌入式计算引擎,已经在 JDBC 中完成了所有运算,不像数据库那样 JDBC 只是个接口,实际运算在独立的数据库服务器完成。
以下用到的第三方 jar 文件都可以在 [安装目录]\esProc\lib 目录下找到。
集算器 JDBC 需要两个基础 jar 包:

esproc-bin-xxxx.jar  //集算器计算引擎及JDBC驱动包
icu4j*.jar  //处理国际化

获取到以上 Jar 后,将其拷贝至 Birt [安装目录]\plugins\org.eclipse.birt.report.data.oda.jdbc_4.6.0.v20160607212\driver 下。注意:不同 birt 版本 driver 的上层目录名略有不同
除了以上的必需 jar,还有一些为完成特定功能的 jar 包:
比如数据库作为数据源,那么还需要相应数据库的驱动 jar 包;
要读写 Office 文件,则需要加入 poi*.jar 、commons-collections*.jar、commons-compress*.jar、commons-io*.jar、xmlbeans*.jar;
要使用绘制图形功能,则需要加入 SVG 图形处理相关的 jar 包,包括 batik-all*.jar、xml-apis*.jar、xml-apis-ext*.jar、xmlgraphics-commons*.jar。

2. 部署 raqsoftConfig.xml

集算器还有个重要的配置文件 raqsoftConfig.xml,可以在 [安装目录]\esProc\config 下找到, 该文件中配置了集算器主路径、dfx 文件寻址路径等各类信息。同样将其拷贝至 Birt [安装目录]\plugins\org.eclipse.birt.report.data.oda.jdbc_4.6.0.v20160607212\driver 下。
注意:配置文件的名称不可改变。

BRIT 报表中调用 SPL

BRIT 调用 SPL,其原理就是将集算器 JDBC 作为数据源,然后将类 SQL 语句的集算器 SPL 脚本作为数据集,从而在报表中调用 SPL 脚本执行后的结果集。

1. Birt 开发工具内新建报表并增加 esprocJDBC 数据源

新建报表,在“DataSources”下新建 JDBC Data Source 类型数据源,并定义数据源名称为:esprocJDBC。
imagepng
点击【Next】,在 Dirver Class 中选择驱动类名com.esproc.jdbc.InternalDriver (v1.0),填写 Database URL 为:jdbc:esproc:local://,用户名和密码为空。
imagepng

点击【Test Connection】测试连接,出现提示信息:” Connection successful. ”则 esprocJDBC 表示连接成功,点击【OK】,数据源创建完成。

2. 创建数据集并在报表中引用

新建“Data Sets”,选择配置的集算器数据源(esprocJDBC),数据集类型选择存储过程(SQL Select Query), 数据集名称定义为:SPLData。
imagepng

点击【Next】,填写查询语句,此处便可以将集算器的 SPL 语句作为查询语句写入。

调用 SPL 语句

比如创建一个数据表,并添加两个字段 baseNum、square2,分别将 100 以内的自然数及其的平方值组成 100 条记录插入到数据表中,最后将表中的数据作为结果集返回,那么 SPL 写法则是:=100.new(~:baseNum,~*~:square2),如下:
imagepng

点击左侧的”Preview Results”可预览数据集:
imagepng
点击【OK】,数据集创建完成。

在报表中引用数据集:
imagepng

在 WEB 端查看报表:
imagepng

通过 SPL 访问本地文件

通过 SPL 还可以访问本地的文件,其中包括 Txt、Excel、Json、Csv、Ctx 等多种类型的文件,访问时可以通过绝对路径查文件位置,也可以通过相对路径查找,使用相对路径时,则是相对于配置文件中的主目录,所以,首先我们来配置下主目录:

在 raqsoftConfig.xml 文件的节点 < Esproc></ Esproc > 中添加以下节点:

  <!--集算器主路径,该路径为单一的绝对路径--> 
  <mainPath>D:\mainFile</mainPath>

我们把要调用的文件 employee.txt 放到主目录下面,其中创建报表与数据源的操作与上例完全相同,数据集调用 SPL 语句:

=file("employee.txt").import@t()

imagepng

预览结果集:

imagepng

对于这种简单运算,还可以使用简单 SQL 语法:$()select * from employee.txt
imagepng

其中 $() 表示访问本地文件系统,两种写法的结果集相同。SPL 访问本地文件时支持绝对路径与相对路径的使用。

带参数的 SPL 语句

参数是 SQL 语句的一个重要组成部分,同样,SPL 语句中也支持参数的使用,例如,上例中,要查询 employee.txt 文件中的数据,但是要求只查询工资在 12000 到 20000 之间的记录,并根据工资升序排序:

首先需要在报表中增加两个参数 param1,param2,并设置参数数据类型为 Integer:

imagepng

imagepng

创建数据集,数据集类型选择存储过程(SQL Stored Procedure Query),数据集内容如下:
Query Text:$()select * from employee.txt where SALARY > ? and SALARY< ? order by SALARY

imagepng

数据集参数配置:

imagepng

数据集预览,此时参数值默认为是报表中设置的参数默认值:

imagepng

在报表中引用该数据集,WEB 端查看报表时,需要先配置参数:

imagepng

报表内容:

imagepng

有数据源的 SPL 语句

集算器 JDBC 既然是个数据计算引擎,那么数据来源的重要途径之一就是数据库了,BIRT 中如何来调用带数据源的 SPL 语句呢?往下看:
BIRT 中调用带数据源的 SPL 语句之前,需要先在应用项目中添加对应的数据库驱动,然后在配置文件 raqsoftConfig.xml 中配置数据源信息,例如:调用的 SPL 语句中使用的数据源名称为 demo,数据库类型为 HSQL,那么配置如下:
首先,将 HSQL 的数据集驱动 hsqldb-2.7.3-jdk8.jar 加载到 Birt [安装目录]\plugins\org.eclipse.birt.report.data.oda.jdbc_4.6.0.v20160607212\driver 下。
其次,在 raqsoftConfig.Xml 的 < Runtime>< /Runtime> 节点中配置数据源信息

<DBList>
<DB name="demo"> <!--数据源名称-->
<property name="url" value="jdbc:hsqldb:hsql://127.0.0.1/demo" /> <!-- url连接-->
<property name="driver" value="org.hsqldb.jdbcDriver" /> <!--数据库驱动-->
<property name="type" value="13" /> <!--数据库类型-->
<property name="user" value="sa" /> <!--用户名-->
 <property name="password" /> <!--密码-->
 <property name="batchSize" value="1000" />
 <property name="autoConnect" value="true" /><!--是否自动连接,如果设定为true,则可以直接以$开头的SQL语句来访问数据库,如果为false,则不会自动连接,使用前必须用connect(db)语句创建数据库连接-->
 <property name="useSchema" value="false" />
 <property name="addTilde" value="false" />
 <property name="dbCharset" value="UTF-8" />
 <property name="clientCharset" value="UTF-8" />
 <property name="needTransContent" value="false" />
 <property name="needTransSentence" value="false" />
 <property name="caseSentence" value="false" />
 </DB>
</DBList>

现在我们通过 SPL 从 demo 数据源中查询 SALES 表,过滤出 SELLERID 为 3 的员工,在 2014 年 11 月 1 号到 2014 年 12 月 12 号期间的所有订单信息:
在报表中创建三个参数:

imagepng

imagepng

imagepng

创建数据集,数据集类型选择存储过程(SQL Stored Procedure Query),数据集内容如下:
Query Text:$(demo)select * from SALES where SELLERID = ? and ORDERDATE>? and ORDERDATE<?
imagepng

配置数据集参数:
imagepng

预览结果集:
imagepng

在报表中引用该数据集,WEB 端查看报表时,需要先配置参数:
imagepng

报表结果:
imagepng

调用 SPL 脚本

BIRT 集成集算器 JDBC 后,除了可以直接执行单句的 SPL 语句,还可以调用更复杂的 SPL 脚本(后缀为 dfx 的文件)。

比如下面的 dfx 文件:


A

B

C

1

=demo.query("select NAME as CITY, STATEID as STATE from   CITIES")

[]


2

for A1

=demo.query("select * from STATES where   STATEID=?",A2.STATE)


3


if left(B2.ABBR,1)==arg1

>A2.STATE=B2.NAME

4



>B1=B1|A2

5

return B1




SPL 脚本思路:

循环遍历 CITIES 表记录,通过 CITIES. STATES 过滤 STATES 表,若 STATES. ABBR 首字母为参数 arg1,则将 STATES 表中的 NAME 值赋给 CITIES. STATE,并将 CITIES 表中的这条记录拼接到 B1 格中,最终返回 B1 格的结果集。

在这个网格文件中,需要从数据源 demo 中获取数据,同时使用了参数 arg1:

imagepng

数据源配置方法可以参考上面的示例,网格文件保存为 city.dfx,dfx 文件可以存放在应用项目类路径或 raqsoftConfig.xml 中配置的主目录下,当 dfx 文件比较多的时候,为了便于统一维护和管理,我们还可以将 dfx 文件放到 dfx 寻址路径中,寻址路径的配置方式如下:
在 raqsoftConfig.xml 文件的 < Esproc> <\Esproc> 节点中,添加以下内容:

<dfxPathList>
   <dfxPath>D:\dfxFile</dfxPath>
   <!--配置dfx文件寻址路径,可以设置多个路径,以“;”隔开。-->
</dfxPathList>

创建一个报表参数:

imagepng

创建数据集,数据集类型选择存储过程(SQL Stored Procedure Query),数据集内容如下:
Query Text:{call city(?)}

imagepng

数据集参数配置:

imagepng

预览数据集:

imagepng

在报表中引用该数据集,WEB 端查看报表时,需要先配置参数:

imagepng

报表结果:

imagepng

以上就是 BIRT 调用 SPL 的用法了,其他程序调用 SPL 的用法如下:

Java 如何调用 SPL 脚本
Java 如何远程调用 SPL 脚本
JasperReport 调用 SPL 脚本
C# 如何调用 SPL 脚本
HTTP 调用 SPL