集算报表用Java动态修改报表数据源
? 實際應用中通過程序動態修改報表模板的情況很常見,其中動態修改數據源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>轉載于:https://blog.51cto.com/report5/1633839
總結
以上是生活随笔為你收集整理的集算报表用Java动态修改报表数据源的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 从网络Url中下载文件
- 下一篇: dojo/request模块整体架构解析