API 修改润乾报表 sql
润乾报表4
客户希望在报表计算之前修改报表数据集的 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>
< !– 发布报表的 tag 标签,与 struts 标签使用类似,其中 name 为必填项,reportFileName 与 beanName 根据发布的报表源类型选择性填写一个 –>
< !– 这里主要讲解了报表源为 bean 的使用,并在 exceptionPage 属性里指定了发生错误时,展现错误信息的页面 –>
< report:html name=”report1″
srcType=”defineBean”
beanName=”ireport”
funcBarLocation=”top”
exceptionPage=”/jsp/myError.jsp”
/>
< /td>
< /table>
< /body>
< /html>
第三步:发布报表。
用上面编写的 jsp 发布报表,在浏览器中浏览就可以看到下面的效果,数据被按照自己设定的方式过滤了,也就是设置的过滤条件起作用了。
这样,用 API 实现修改数据集 sql 的功能就实现了。