API修改报表sql
客户希望在报表计算之前修改报表数据集的sql语句,然后在计算报表的时候让报表的数据集执行这个新的sql语句,从而实现客户自己的业务逻辑。下面就用一个例子实现上面的需求。
实现思路:这个问题可以直接在jsp中解决,用API读入报表模板,再得到数据集的sql语句,让客户根据自己的需要对sql进行修改,然后再让报表重新读取这个数据集,然后计算报表,最后用bean的方式发布。
第一步:制作一张报表,连接demo数据源。
首先制作一张连接demo数据源的报表,报表的数据集ds1的sql为:SELECT 订单.订单ID,订单.货主名称,订单.货主国家,订单.货主地区 FROM 订单,报表的样式如下图所示:
然后保存这个报表为test.raq。
第二步:编写jsp,实现修改报表sql和发布报表。
修改报表数据集sql的API和内容的注释如下:
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为必填项,reportFileName与beanName根据发布的报表源类型选择性填写一个 –>
<!– 这里主要讲解了报表源为bean的使用,并在exceptionPage属性里指定了发生错误时,展现错误信息的页面 –>
<report:html name=”report1″
srcType=”defineBean”
beanName=”ireport”
funcBarLocation=”top”
exceptionPage=”/jsp/myError.jsp”
/>
</td></tr>
</table>
</body>
</html>
第三步:发布报表。
用上面编写的jsp发布报表,在浏览器中浏览就可以看到下面的效果,数据被按照自己设定的方式过滤了,也就是设置的过滤条件起作用了。
这样用API实现修改数据集sql的功能就实现了。