集算器概述
集算器是一种程序设计语言,专注于(半)结构化数据计算。采用了新的数据和计算模型,提供了丰富的基础计算方法,使计算更易于完成且性能更好。
集算器是基于Java解释执行的动态语言,可以在运行过程中拼出代码执行,这样可以获得更大的灵活性,进一步降低程序设计的复杂度。
集算器应用结构如下
通过上图结构可以看出,集算器可以通过JDBC方式解释执行,返回数据处理的结果。
加入集算器的传统报表应用结构
当前,报表工具可以在呈现阶段直接实现多数据源关联计算和比上期同期比等层次格间引用计算,但即使这样,仍然大量碰到复杂数据准备的需求, 开发工作量很繁重。这时,引入计算中间层希望更便捷地实现数据准备就是个比较自然的想法。面对这类报表,我们不能再期望零编码,而是基于集算器简单编码。
这是引入了集算器后报表应用的体系结构图,从图中可以看到,比传统报表应用结构中多了一个计算层:数据源的数据先经过计算层的计算,再传给呈现层去展现。
润乾集算器与帆软报表应用集成
接下来的内容,我们将以帆软报表工具为例,介绍如何将集算器引入到其报表应用的体系结构中。
一、与帆软的报表应用做集成(实际也可称为部署集算器JDBC)
1、 加载需要用到的jar包
集算器安装路径esProc\lib下,需要引入三个基础jar包:
dm.jar 集算器计算引擎及JDBC驱动包
icu4j_3_4_5.jar 处理国际化
dom4j-1.6.1.jar 解析配置文件
注:除基础包外,还有一些特定功能的jar,比如要在集算器JDBC中读写Microsoft Office文件,则需要加入poi*.jar、xmlbeans-2.3.0.jar等。
将以上三个基础jar放置到帆软设计器安装路径WebReport\WEB-INF\lib下。
2、 部署xml配置文件
配置文件两个:raqsoftConfig.xml和dfxConfig.xml。
分别可以在[集算器安装目录]\esProc\config和[集算器安装目录]\esProc\classes目录下找到。
复制后放置在帆软的报表应用类路径下,即[帆软安装目录]\ WebReport\WEB-INF\classes。
3、 配置集算器授权
集算器脚本的执行需要授权支持,在获取到授权文件后,可在raqsoftConfig.xml中如下位置配置:
<Esproc>
<license>集算器授权.lic</license>
<charSet>GBK</charSet>
</Esproc>
<!—lic文件放到类路径下-->
二、开发并部署集算器dfx脚本文件
我们这里以dfx读取excle文件数据为例,读取后展现,简单示例一下。
Excel内容如下
集算器脚本,保存为FR.dfx
其中,A1读取excel文件并将第一个sheet页的数据读入且第一行作为字段名称行。
注:excel或其他数据文件路径可以是绝对也可以是相对。
三、开发帆软报表程序数据集(实现JDBC调用集算器脚本)
帆软报表程序数据集的开发方式可参考其文档介绍,本文不做介绍。下面直接看实现的代码(核心为jdbc获取数据,转为帆软可识别的数据格式):
packagecom.fr.data;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.util.ArrayList;
importcom.esproc.jdbc.ResultSet;
importcom.esproc.jdbc.ResultSetMetaData;
publicclass RQ_esProc_dataset extends AbstractTableData {
/**
* bubblegum20170809
*/
private static final long serialVersionUID =1L;
// 定义程序数据集的列名与数据保存位置
private String[] columnNames;
// list形式返回数据作为数据集
private ArrayList valueList = null;
// 实现构建函数,在构建函数中准备数据 ,仅返回前5列数据,f1到f5为字段名
public RQ_esProc_dataset() {
String[] columnNames ={"f1","f2","f3","f4","f5"};
this.columnNames = columnNames;
}
// 准备数据
public void init() {
// 确保只被执行一次
if (valueList != null) {
return;
}
// 保存得到的结果集
valueList = new ArrayList();
Connection con = null;
com.esproc.jdbc.InternalCStatement st;
try{
//建立集算器jdbc连接
Class.forName("com.esproc.jdbc.InternalDriver");
con= DriverManager.getConnection("jdbc:esproc:local://");
//调用存储过程,其中FR是dfx的文件名
st =(com. esproc.jdbc.InternalCStatement)con.prepareCall("call FR()");
//执行
st.execute();
//获取结果集
ResultSet rs = (ResultSet) st.getResultSet();
//简单处理结果集,将结果集中的字段名与数据输出
ResultSetMetaData rsmd =(ResultSetMetaData) rs.getMetaData();
int colCount =rsmd.getColumnCount();
Object[] objArray = null;
while (rs.next()) {
//遍历,仅获取前5列数据转换
objArray= new Object[5];
for (int c = 1; c<=5; c++) {
Object o = rs.getObject(c);
objArray[c-1] = o;
}
valueList.add(objArray);
}
}catch(Exception e){
System.out.println(e);
}finally{
//关闭连接
if (con!=null) {
try {
con.close();
}catch(Exception e) {
System.out.println(e);
}}}}
注:通过以上代码可以看出,集算器不仅仅对报表工具所展现数据处理服务,其他java开发所需数据处理时 也可引入。
最后,将编译的class放置到对应类路径下即可,如classes/com/fr/data
四、帆软设计器设计报表并调用采用集算器作为数据处理的程序数据集
1、 新建工作簿并添加程序数据集
数据集加载后效果(定义的5个字段已显示)
2、 设计简单的网格报表
五、WEB端报表效果