JSP傳參數給Birt的兩種方法

來源:互聯網
上載者:User

關於給報表傳值:

如果你不使用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語句中的“?”號對應資料集參數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.