9.1 表內的嵌套
我們新建報表MasterDetailOneReport_A.rptdesign,空白模板,示例數據庫,sql選擇查詢數據集。
新建數據集Orders:
select *
from orders
新建數據集SingleOrderDetail
select *
from orderdetails
where ordernumber = ?
數據集參數默認值爲10101。
新建靜態文本報表參數ordernumber,默認值:10101
在報表編輯器中插入2行5列的表,在第一行分別拖入Orders數據集中如下的數據列:
合併第二行的前四列,在第五列中插入一個1行5列的表,分別拖入SingleOrderDetail的數據集:
作適當的美化,佈局,最終如下:
選中表,編輯數據集綁定:
綁定數據集SingleOrderDetail參數至row["ORDERNUMBER"]
這樣就完成了一個內嵌的報表,預覽如下:
9.2 表外的嵌套
同上例子,我們新建報表MasterDetailOneReport_B.rptdesign,空白模板,示例數據庫,sql選擇查詢數據集。
新建數據集Orders:
select *
from orders
新建數據集SingleOrderDetail
select *
from orderdetails
where ordernumber = ?
數據集參數默認值爲10101。
新建靜態文本報表參數ordernumber,默認值:10101
我們插入兩個2行1列的網格:
第一個網格,第一行插入文本:
這個案例用於描述怎麼從一個數據項,外嵌產生另一個報表,傳入一個參數,方法如下:
reportContext.setGlobalVariable("ordernum", dataSetRow["ORDERNUMBER"]);
dataSetRow["ORDERNUMBER"]
第二行插入一個1行5列的表,分別拖入Orders數據集的數據列:
其中ordernumber數據項用的表達式生成器,輸入
reportContext.setGlobalVariable("ordernum", dataSetRow["ORDERNUMBER"]);
dataSetRow["ORDERNUMBER"]
第二個網格,第一行輸入文本:
這個表格用於從環境標量中獲取參數,用於表的數據集的參數,方法如下:
reportContext.getGlobalVariable("ordernum");
第二行插入1行5列的表,分別拖入SingleOrderDetail數據集的數據列:
編輯表的綁定:
輸入表達式生成器文本:reportContext.getGlobalVariable("ordernum");
預覽,效果如下:
9.3 參數的傳遞
一、第一種方法:
1、在jsp的URL裏面添加所要傳遞的參數:
http://localhost:8080/birt-web/frameset?__report=test.rptdesign&sample=parameter
2、在報表當中添加同名報表參數sample,數據集帶有佔位符參數,然後可以添加data set參數關聯到報表參數sample,這樣data set參數就可以得到從jsp頁面傳遞過來的參數從而作爲查詢條件。
二、第二種方法:
1、在jsp的URL裏面添加所要傳遞的參數:
http://localhost:8080/birt-web/frameset?__report=test.rptdesign&id=3
2、在報表當中添加同名報表參數id
3、點擊 Date Sets,在點中間的"Script"標籤,選擇BeforeOpen,寫上
var id = params["id"].value;
if(id!=null){
this.queryText=this.queryText+" where id='"+id+"'";
}
三、第三種方法:
BIRT VIEWER本身雖然支持在裏面書寫java code,但不宜用於request setParameter,getParameter,或者session的方法,但提供了一個接口在jsp或者servelet中通過AppContextKey和AppContextValue鍵值對來傳遞,BIRT viewer能自動識別出。
Map<String, String> map=new HashMap<String, String>();
String name=request.getParameter("name");
String stime =request.getParameter("stime ");
String age=request.getParameter("age");
String sex=request.getParameter("sex");
HashMap appContext = new HashMap( );
appContext.put("stime",stime);
appContext.put("name",name);
appContext.put("age",age);
appContext.put("sex",sex);
request.getSession().setAttribute( "AppContextKey","numberWhere");
request.getSession().setAttribute("AppContextValue", appContext);
request.getRequestDispatcher( "/frameset?__report=testreport.rptdesign").forward(request,response);
在report中用beforeOpen中取出即可:
var name=numberWhere.get("name");
var age=numberWhere.get("age");
var sex=numberWhere.get("sex");
說明:前兩種,當傳遞中文參數的時候,可能會出現字符串長度超限,或者傳遞了encode之後的代碼,這個時候需要進行如下的處理unescape(params["OrderNumber"].value):
如果參數中被添加了括號,則需要更復雜的處理,比如去掉前後方括號:
BirtStr.trim(unescape(params["trandate"].value).replace("[","").replace("]",""))
至於腳本的書寫,後文再詳細介紹。