經常會遇到一些報表需要根據不同的情況(參數)連接不同的數據源從而完成相應的數據的展現,也就是經常說的動態數據源報表。
實現動態數據源有多種方法:具體說兩種使用過的方法:
第一種:使用腳本集算器法
使用集算腳本編輯工具完成計算腳本,並為報表輸出計算后結果集:
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