经常会遇到一些报表需要根据不同的情况(参数)连接不同的数据源从而完成相应的数据的展现,也就是经常说的动态数据源报表。
实现动态数据源有多种方法:具体说两种使用过的方法:
第一种:使用脚本集算器法
使用集算脚本编辑工具完成计算脚本,并为报表输出计算后结果集:
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 />
优点:只使用报表即可 缺点:编写复杂,不易懂
以上实测有效。以下为了解方法,未实践。
第三种:使用API方式
参考连接地址:http://blog.sina.com.cn/s/blog_8910bc4f0100ugyd.html
第四种:润乾报表实现(官方论坛方法)
参考地址:http://bbs.raqsoft.com.cn/portal.php?mod=view&aid=394