动态数据源报表
经常会遇到一些报表需要根据不同的情况(参数)连接不同的数据源从而完成相应的数据的展现,也就是经常说的动态数据源报表。
实现动态数据源有多种方法:具体说两种使用过的方法:
第一种:使用脚本集算器法
使用集算脚本编辑工具完成计算脚本,并为报表输出计算后结果集:
A1:根据参数dbname参数值决定数据源
A2:编写查询SQL
A3:执行sql取数
A4:关闭连接
A5:将结果集返回报表
优点:开发简单,理解方便。缺点:必须 集算器授权
第二种:TAG标签
1、导包
1 <%@ page import="com.raqsoft.report.usermodel.Context"%>
2 <%@ page import="com.raqsoft.report.view.*"%>
3 <%@ page import="com.raqsoft.report.util.*"%>
4 <%@ page import="com.raqsoft.report.model.ReportDefine"%>
5 <%@ page import="com.raqsoft.report.usermodel.DataSetMetaData"%>
6 <%@ page import="com.raqsoft.report.usermodel.DataSetConfig"%>
2.编写更换数据源的方法
1 <%!
2 public static ReportDefine changeDataSource(String filePath, String dataSourceName){
3 ReportDefine rd = null;
4 try{
5 rd = (ReportDefine)ReportUtils.read(filePath);//读取报表
6 DataSetMetaData dsmd = rd.getDataSetMetaData(); //取数据集元数据
7 for(int i=0; i<dsmd.getDataSetConfigCount(); i++){//遍历数据集
8 DataSetConfig dsc = dsmd.getDataSetConfig( i );//数据集配置 数据集的抽象定义
9 dsc.setDataSourceName( dataSourceName );//设置数据集引用到的数据源名称
10 dsmd.setDataSetConfig( i, dsc);//修改数据集配置
11 }
12 rd.setDataSetMetaData(dsmd);//设置数据集元数据
13 ReportUtils.write(filePath, rd);//保存修改后的rd文件
14 }catch(Exception e){
15 return null;
16 }
17 return rd;
18 }
19 %>
3.调用换取数据源方法
1 //获取数据源名称
2 String dbname = request.getParameter("dbname");
3
4 //动态设置报表中数据集的数据源
5 String reportPath = request.getRealPath("/WEB-INF/reportFiles/"+report);
6 ReportDefine rd = changeDataSource(reportPath, dbname);
7
8 //把 ReportDefine 放在Request 中,方便取用
9 String rptName = "RPT_"+Double.toString(Math.random());
10 request.setAttribute(rptName,rd);
4.发布报表
使用defineBean方式发布报表,有参数模版包括参数模版
1 <report:param name="form1"
2 srcType="defineBean"
3 beanName="<%=paramsFileName%>"
4 needSubmit="no"
5 params="<%=param.toString()%>"
6 hiddenParams="<%=param.toString()%>"
7 needImportEasyui="no"
8 resultContainer="reportContainer"
9 resultPage="<%=resultPage%>"
10 />
11
12 <report:html name="report1"
13 srcType="defineBean"
14 beanName="<%=rptName%>"
15 funcBarLocation="no"
16 needScroll="<%=scroll%>"
17 generateParamForm="no"
18 params="<%=param.toString()%>"
19 exceptionPage="/reportJsp/myError2.jsp"
20 appletJarName="/raqsoftReportApplet.jar"
21 scrollWidth="100%"
22 scrollHeight="100%"
23 needImportEasyui="no"
24 printedRaq="<%=exportReportName%>"
25 />
优点:只使用报表即可 缺点:编写复杂,不易懂
以上实测有效。以下为了解方法,未实践。