API修改报表sql

    客户希望在报表计算之前修改报表数据集的sql语句,然后在计算报表的时候让报表的数据集执行这个新的sql语句,从而实现客户自己的业务逻辑。下面就用一个例子实现上面的需求。

 

实现思路:这个问题可以直接在jsp中解决,用API读入报表模板,再得到数据集的sql语句,让客户根据自己的需要对sql进行修改,然后再让报表重新读取这个数据集,然后计算报表,最后用bean的方式发布。

 

第一步:制作一张报表,连接demo数据源。

首先制作一张连接demo数据源的报表,报表的数据集ds1sql为:SELECT 订单.订单ID,订单.货主名称,订单.货主国家,订单.货主地区 FROM 订单,报表的样式如下图所示:

 

 

然后保存这个报表为test.raq

 

第二步:编写jsp,实现修改报表sql和发布报表。

修改报表数据集sqlAPI和内容的注释如下:

 

       String report = request.getParameter(“report”);

 

       System.out.println(“取得的报表名是:“+report);

 

       //传入报表为空的情况下,赋于默认报表。

       if(report==null)  report = “test.raq”;

 

       String path = application.getRealPath(“/reportFiles/”+report);

 

       System.out.println(“获取的报表路径:“+path);

 

       //从报表文件中构造一个报表定义对象

       ReportDefine rd = (ReportDefine)ReportUtils.read(path);

 

       DataSetMetaData dsmd = rd.getDataSetMetaData(); //获得报表定义中的数据集元对象

 

       SQLDataSetConfig sdsc = (SQLDataSetConfig)dsmd.getDataSetConfig(“ds1″); //取到需要修改的数据集对象

 

       String sql =sdsc.getSQL(); //取得数据集对象中的SQL

 

       System.out.println(“报表对象的SQL“+sql);

 

       //修改sql

    sql= sql + “where CAST(订单.订单ID AS INTEGER)   <=10260”

 

       System.out.println(“加上参数的SQL“+sql);

 

       //将修改后的SQL设置到数据集对象中

       sdsc.setSQL( sql );

 

       dsmd.setDataSetConfig(sdsc);

 

       rd.setDataSetMetaData(dsmd);

用如上的代码可以实现修改报表数据集的sql,修改好sql后可以用如下的方式计算报表,然后采用bean的方式发布:

Context ctx = new Context();

Engine engine = new Engine(rd,ctx);

IReport ireport = Engine. calc ();

这样报表就计算好了,然后用bean的方式发布报表,jsp的内容如下:

<%@ page contentType=”text/html;charset=GBK”%>

<%@page import=”com.zhengzhong.practise.ConnectDemo”%>

<%@ taglib uri=”/WEB-INF/runqianReport4.tld” prefix=”report”%>

<%@ page import=”com.runqian.report4.model.*”%>

<%@ page import=”com.runqian.report4.usermodel.*”%>

<%@ page import=”com.runqian.report4.util.*”%>

<%@ page import=”java.util.*”%>

<html>

<body topmargin=0 leftmargin=0 rightmargin=0 bottomMargin=0>

<%

       String report = request.getParameter(“report”);

 

       System.out.println(“取得的报表名是:“+report);

 

       //传入报表为空的情况下,赋于默认报表。

       if(report==null)  report = “test.raq”;

 

       String path = application.getRealPath(“/reportFiles/”+report);

 

       System.out.println(“获取的报表路径:“+path);

 

       //从报表文件中构造一个报表定义对象

       ReportDefine rd = (ReportDefine)ReportUtils.read(path);

 

       DataSetMetaData dsmd = rd.getDataSetMetaData(); //获得报表定义中的数据集元对象

 

       SQLDataSetConfig sdsc = (SQLDataSetConfig)dsmd.getDataSetConfig(“ds1″); //取到需要修改的数据集对象

 

       String sql =sdsc.getSQL(); //取得数据集对象中的SQL

 

       System.out.println(“报表对象的SQL“+sql);

 

       //修改sql

    sql= sql + “where CAST(订单.订单ID AS INTEGER)   <=10260” ;

 

       System.out.println(“加上参数的SQL“+sql);

 

       //将修改后的SQL设置到数据集对象中

       sdsc.setSQL( sql );

 

       dsmd.setDataSetConfig(sdsc);

 

       rd.setDataSetMetaData(dsmd);

    Context ctx = new Context();

    IReport ireport = Engine. calc ();

%>

<table align=left>

       <tr><td>

              <!– 发布报表的tag标签,与struts标签使用类似,其中name为必填项,reportFileNamebeanName根据发布的报表源类型选择性填写一个 –>

              <!– 这里主要讲解了报表源为bean的使用,并在exceptionPage属性里指定了发生错误时,展现错误信息的页面 –>

 

                     <report:html name=”report1″

                     srcType=”defineBean”

                     beanName=”ireport”

                     funcBarLocation=”top”

                     exceptionPage=”/jsp/myError.jsp”

              />

       </td></tr>

</table>

 

</body>

</html>

 

第三步:发布报表。

用上面编写的jsp发布报表,在浏览器中浏览就可以看到下面的效果,数据被按照自己设定的方式过滤了,也就是设置的过滤条件起作用了。

 

这样用API实现修改数据集sql的功能就实现了。

热门文章