经常会遇到一些报表需要根据不同的情况(参数)连接不同的数据源从而完成相应的数据的展现,也就是经常说的动态数据源报表。报表工具通常的做法有两种,一是不同的情况加载不同的数据源连接参数,如:url、driver、username、password等;二是利用已配置的多个连接池,根据不同情况选择。这里通过一个实例,说明润乾报表的实现过程及改进方案。
报表说明
应用中需要通过参数控制报表连接的数据源,当参数flag为1时连接数据源一(db1),否则连接数据源二(db2)。
润乾报表实现
首先根据flag参数为context设置不同数据源(这里以两个hsql数据库为例):
String flag=request.getParameter("flag");
Connection con1 = null;
Connection con2 = null;
try{
Driver driver = (Driver)Class.forName("org.hsqldb.jdbcDriver").newInstance();
DriverManager.registerDriver(driver);
con1=DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/runqianDB","sa","");
con2=DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/demo","sa","");
}catch (Exception e){
e.printStackTrace();
}
Context cxt= new Context();
String defDsName =cxt.getDefDataSourceName ();
if ("1".equals(flag) || "1"==flag){
cxt.setConnection(defDsName,con1);
}else{
cxt.setConnection(defDsName,con2);
}
将cxt存入request:
request.setAttribute("myContext", cxt );
以context方式发布报表:
<report:htmlname="report1"
contextName=”myContext”
/>
通过使用润乾报表的API可以完成动态数据源报表,详尽的API的确为应用开发人员提供了诸多便利。不过,由于上面的做法我们看到都需要依赖Java编程,修改维护性很差,对一般报表开发维护人员都是不小的挑战。
这种情况下,如果采用润乾公司基于润乾报表引擎开发的集算报表,则可以非常方便完成动态数据源报表需求,集算报表内置了用于处理报表数据源准备的集算器,在集算器中编写处理动态数据源的代码比较简单。
集算报表实现
编写集算脚本
使用集算脚本编辑工具完成计算脚本,并为报表输出计算后结果集:
A1:根据参数flag值决定连接哪个数据源(db1和db2为数据源名称)
A2:执行sql取数
A3:关闭连接
A4:将结果集返回报表
报表调用
在集算脚本中处理动态数据源后,将结果输出给报表模板,报表模板使用时就好像在使用一个数据源一样,从而简化了报表开发。此外,集算器脚本允许用户分步编写计算逻辑,并且代码比较简单(相对Java和sql来说),从而提升了报表开发和维护效率。
润乾报表实现动态数据源报表及改进