第九章 BIRT嵌套報表以及參數的傳遞

9.1 表內的嵌套

我們新建報表MasterDetailOneReport_A.rptdesign,空白模板,示例數據庫,sql選擇查詢數據集。

新建數據集Orders:

select *

from orders

新建數據集SingleOrderDetail

select *

from orderdetails

where ordernumber = ?

數據集參數默認值爲10101。

新建靜態文本報表參數ordernumber,默認值:10101

在報表編輯器中插入25列的表,在第一行分別拖入Orders數據集中如下的數據列:

合併第二行的前四列,在第五列中插入一個15列的表,分別拖入SingleOrderDetail的數據集:


作適當的美化,佈局,最終如下:


選中表,編輯數據集綁定:


綁定數據集SingleOrderDetail參數至row["ORDERNUMBER"]


這樣就完成了一個內嵌的報表,預覽如下:


9.2 表外的嵌套

同上例子,我們新建報表MasterDetailOneReport_B.rptdesign,空白模板,示例數據庫,sql選擇查詢數據集。

新建數據集Orders:

select *

from orders

新建數據集SingleOrderDetail

select *

from orderdetails

where ordernumber = ?

數據集參數默認值爲10101。

新建靜態文本報表參數ordernumber,默認值:10101

我們插入兩個21列的網格:

第一個網格,第一行插入文本:

這個案例用於描述怎麼從一個數據項,外嵌產生另一個報表,傳入一個參數,方法如下:

reportContext.setGlobalVariable("ordernum", dataSetRow["ORDERNUMBER"]); 

dataSetRow["ORDERNUMBER"]

第二行插入一個15列的表,分別拖入Orders數據集的數據列:


其中ordernumber數據項用的表達式生成器,輸入

reportContext.setGlobalVariable("ordernum", dataSetRow["ORDERNUMBER"]); 

dataSetRow["ORDERNUMBER"]


第二個網格,第一行輸入文本:

這個表格用於從環境標量中獲取參數,用於表的數據集的參數,方法如下:

reportContext.getGlobalVariable("ordernum");

第二行插入15列的表,分別拖入SingleOrderDetail數據集的數據列:


編輯表的綁定:


輸入表達式生成器文本:reportContext.getGlobalVariable("ordernum");


預覽,效果如下:


9.3 參數的傳遞

一、第一種方法:

1、在jspURL裏面添加所要傳遞的參數:

http://localhost:8080/birt-web/frameset?__report=test.rptdesign&sample=parameter

2、在報表當中添加同名報表參數sample,數據集帶有佔位符參數,然後可以添加data set參數關聯到報表參數sample,這樣data set參數就可以得到從jsp頁面傳遞過來的參數從而作爲查詢條件。

二、第二種方法:

1、在jspURL裏面添加所要傳遞的參數:

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中通過AppContextKeyAppContextValue鍵值對來傳遞,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("]",""))

至於腳本的書寫,後文再詳細介紹。

發佈了57 篇原創文章 · 獲贊 3 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章