關於給報表傳值:
如果你不使用birt viewer的話,那就是使用api調你的報表,birt api有設定參數的api.
如果使用birt viewer,直接通過url或者使用birt 標籤都是可以的。
本文只是用jsp的url方式傳遞參數給birt報表,然後在birt的sql語句裡面使用:
一、第一個中方法:
1、在jsp的URL裡面添加所要傳遞的參數:
http://localhost:8080/birt-web/frameset?__report=test.rptdesign&sample=my+parameter
2、在報表當中添加同名報表參數sample,然後可以添加data set參數關聯到報表參數sample,這樣data set參數就可以得到從jsp頁面傳遞過來的參數從而作為查詢條件。
二、第二種方法:
1、在jsp的URL裡面添加所要傳遞的參數:
http://localhost:8080/birt-web/frameset?__report=test.rptdesign&sample=my+parameter
2、在報表當中添加同名報表參數sample
3、點擊 Date Sets,在點中間的"Script"標籤,選擇BeforeOpen,寫上var sample = params["sample"].value;
if(isample=="null"){
this.queryText +="where 1=1" ;
}
else {
this.queryText +=" where sample=" + sample ;
}4、如此設定之後就不用再data set裡面設定data set參數。 另一種實現方式:
1.jsp版面設定幾個需要傳遞參數的文字框
jsp代碼
<script type="text/javascript"> function search(){ var st = document.getElementById("st").value;//開始日期 var et = document.getElementById("et").value;//結束日期 window.location.href = "run?__report=reports/new_report.rptdesign&__parameterpage=false&st="+st+"&et="+et; } function print(){ var st = document.getElementById("st").value;//開始日期 var et = document.getElementById("et").value;//結束日期 window.location.href = "frameset?__report=reports/new_report.rptdesign&__parameterpage=false&st="+st+"&et="+et; } </script> </head> <body> <input type="text" name="st" id="st"><br> <input type="text" name="et" id="et"><br> <input type="button" value=" 查 詢 " onclick="search()"> <input type="button" value=" 打 印 " onclick="print()"> </body>
注: 當點擊 查詢 按鈕時 用js指定轉到的url
(window.location.href = "run?__report=reports/new_report.rptdesign&__parameterpage=false&st="+st+"&et="+et;)
(1)run(只能顯示, 沒有列印, 分頁等功能): 和普通的html頁面顯示的效果一樣,樣式需要在報表中設計, 改成frameset則有所有功能
(2)參數:st(起始日期), et(結束日期)
2. rptdesign檔案設定
(1).報表參數
Name Data type Display Display As--Format as
st Data Text Box Custom:yyyy-MM-dd
et Data Text Box Custom:yyyy-MM-dd
(2).資料集參數
Name Data Type Direction Defalut Value Linked To Report Paramter
st Date Input N/A st
et Date Input N/A et
(3).資料集sql(時間從 ? 到 ? 的時間段的記錄)
select * from tabelName where tbtime betweem ? and ?
原來用URL方式向Birt進行參數傳遞,發現二個問題
1.需要用urldecode進行二次處理,麻煩;
2.參數長度有限制,噁心。遇到長一點參數就沒有辦法了;
後來就考慮在script中通過session 參數進行傳遞
Java代碼
importPackage(Packages.java.io,Packages.java.util,Packages.java.net); importPackage(Packages.javax.servlet.http); request=reportContext.getHttpServlet(); var session = request.getSession(); status = session.getAttribute("whereClause");
結果發現request始終是null,原因是此request不同於javax下的request,其實經過Java處理也是可以實現,但我覺得太煩了。
研究了N久發現了通過
Adding an Object to the Application Context for the Viewer
中利用appcontext的方法傳遞資料。終於成功簡單的處理了Birt web參數傳遞。而且傳遞的內容和長度和java一致。
Java代碼
String contextKey = "whereClause"; request.getSession().setAttribute("AppContextKey", contextKey); request.getSession().setAttribute("AppContextValue", sql);
在report中用
beforeOpen中取出即可
如何把java代碼中參數傳遞給報表?在報表中又怎樣擷取這個參數?
答:通過這種方式給報表傳參:
HashMap paramMap = new HashMap();
paramMap.put("birtparam1", 1);
paramMap.put("birtparam2", 5);
task.setParameterValues(paramMap);
設定報表參數與傳遞的參數同名,這樣就關聯起來了
資料集參數與報表參數綁定
sql語句中的“?”號對應資料集參數