实际应用中通过程序动态修改报表模板的情况很常见,其中动态修改数据源SQL就是一种典型场景。常见于系统中有一些结构相同而数据源不同的报表,为减少报表开发工作量,只开发一套报表模板,使用时通过程序动态修改数据源来满足实际需要。
下面通过一个使用JAVA程序修改集算报表数据源SQL的例子说明使用过程。
编辑报表模板:
由于不同数据源的字段不同,因此这里使用动态表达式ds1.fname()获取字段名,ds1.field()获取字段值。此外,第一行和第一列为辅助行列,设置其隐藏。
编写代码:
1.读入报表
StringreportPath = request.getRealPath("/reportFiles/demo.rpx");
ReportDefinerd = (ReportDefine)ReportUtils.read(reportPath);
2.更改报表数据源
DataSetMetaDatadsmd=newDataSetMetaData(); //构造数据集元数据
SQLDataSetConfigsdc=newSQLDataSetConfig(); //构造数据集定义
sdc.setName("ds1"); //设置数据集名
Stringsql = "";
//根据不同参数,为报表设置不同数据源SQL,实际使用中可以从配置文件中读取
switch(Integer.parseInt(type)){
case 1:
sql="select * from 员工表";
break;
case 2:
sql="select * from 订单明细 order by 订单ID";
break;
default:sql="select * from 客户销售表";
}
sdc.setSQL(sql); //设置 sql语句
dsmd.addDataSetConfig(sdc); //把数据集定义添加到数据集元数据
rd.setDataSetMetaData(dsmd); //把数据集元数据赋给ReportDefine
3. 将ReportDefine存入request后使用defineBean方式发布报表
rd.setDataSetMetaData(dsmd); //把数据集元数据赋给ReportDefine
request.setAttribute("reportDefine",rd);
<report:html name="report1"
srcType="defineBean"
beanName="reportDefine"
exceptionPage="/reportJsp/jsp/myError.jsp"
/>
实现效果:
当type=1时显示员工信息表数据:
当type=2时显示订单明细表数据:
【附】changeds.jsp完整代码:
<%@ page contentType="text/html;charset=GBK"%>
<%@ taglib uri="/WEB-INF/raqsoftReport.tld"prefix="report" %>
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<%@ page import="com.raqsoft.report.usermodel.Context"%>
<%@ page import="com.raqsoft.report.model.ReportDefine"%>
<%@ page import="com.raqsoft.report.util.ReportUtils"%>
<%@page import="com.raqsoft.report.usermodel.SQLDataSetConfig"%>
<%@page import="com.raqsoft.report.usermodel.DataSetMetaData"%>
<html>
<link type="text/css"href="css/style.css" rel="stylesheet"/>
<body topmargin=0 leftmargin=0 rightmargin=0 bottomMargin=0>
<%
request.setCharacterEncoding("GBK");
Stringtype = request.getParameter("type");
//取得报表真实路径
StringreportPath = request.getRealPath("/reportFiles/demo.rpx");
ReportDefinerd = (ReportDefine)ReportUtils.read(reportPath);
DataSetMetaDatadsmd=newDataSetMetaData(); //构造数据集元数据
SQLDataSetConfigsdc=newSQLDataSetConfig(); //构造数据集定义
sdc.setName("ds1"); //设置数据集名
Stringsql = "";
//根据不同参数,为报表设置不同数据源SQL,实际使用中可以从配置文件中读取
switch(Integer.parseInt(type)){
case 1:
sql="select * from 员工表";
break;
case 2:
sql="select * from 订单明细 order by 订单ID";
break;
default:sql="select * from 客户销售表";
}
sdc.setSQL(sql); //设置 sql语句
dsmd.addDataSetConfig(sdc); //把数据集定义添加到数据集元数据
rd.setDataSetMetaData(dsmd); //把数据集元数据赋给ReportDefine
request.setAttribute("reportDefine",rd);
%>
<jsp:include page="toolbar.jsp"flush="false" />
<table id="rpt"align="center" width=100% height=100%>
<tr><td align=center valign=top height=100%>
<report:html name="report1"
srcType="defineBean"
beanName="reportDefine"
exceptionPage="/reportJsp/jsp/myError.jsp"
/>
</td></tr>
</table>
</body>
</html>本文出自 “高性能报表数据计算” 博客,请务必保留此出处http://report5.blog.51cto.com/8028595/1633839
原文地址:http://report5.blog.51cto.com/8028595/1633839