经常会遇到一些报表需要根据不同的情况(参数)连接不同的数据源从而完成相应的数据的展现,也就是经常说的动态数据源报表。报表工具通常的做法有两种,一是不同的情况加载不同的数据源连接参数,如:urldriverusernamepassword等;二是利用已配置的多个连接池,根据不同情况选择。这里通过一个实例,说明润乾报表的实现过程及改进方案。

报表说明

    应用中需要通过参数控制报表连接的数据源,当参数flag1时连接数据源一(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编程,修改维护性很差,对一般报表开发维护人员都是不小的挑战。

    这种情况下,如果采用润乾公司基于润乾报表引擎开发的集算报表,则可以非常方便完成动态数据源报表需求,集算报表内置了用于处理报表数据源准备的集算器,在集算器中编写处理动态数据源的代码比较简单。

集算报表实现

编写集算脚本

     使用集算脚本编辑工具完成计算脚本,并为报表输出计算后结果集:

wKioL1PteBGxqkHyAAFVQZ0N_9w697.jpg

    A1:根据参数flag值决定连接哪个数据源(db1db2为数据源名称)

    A2:执行sql取数

    A3:关闭连接

    A4:将结果集返回报表 

报表调用

wKioL1PteBLTYH3nAAE5lbuNa80476.jpg

在集算脚本中处理动态数据源后,将结果输出给报表模板,报表模板使用时就好像在使用一个数据源一样,从而简化了报表开发。此外,集算器脚本允许用户分步编写计算逻辑,并且代码比较简单(相对Javasql来说),从而提升了报表开发和维护效率。