由於篇幅所限,本篇承接上一篇Eclipse圖表工具Birt的使用技巧(二)繼續介紹Birt的小技巧.html
4. 公共數據源java
項目製做中,多個報表文件可能須要使用同一個DataSet,Cube,DataSource這些東西,若是爲每個rptdesign文件都配置很麻煩,並且修改繁瑣. 數據庫
可使用一個Library文件,統一集中處理這些數據源.如今項目中新建一個Library文件,如圖: 服務器
建立好的rptlibrary文件盒報表文件很像,咱們直接在這個文件上新建數據源和數據集還有多維數據集.這裏不顯示了,和正常的建立同樣. 函數
建立完畢後,咱們返回到一個正常的報表rptdesign文件,在Library Explorer窗口中找到剛纔建立的那個library文件.此時能夠快速的將Datasource,DataSet,Cube添加到咱們的報表文件中.如圖: 工具
右鍵你要添加到當前報表的項,而後Add to Report 便可.若是之後Liberty文件的這些數據源信息有改變,對應的各個文件中的數據源也會有變化.添加成功後,再看報表中的數據源顯示以下: this
和正常報表本身建立的數據源會有區別. url
5. 針對排序出現錯誤的問題. spa
這種問題一般可能會出如今相似這種情景裏,好比藥品,如今作一個圖表,顯示按季度爲維度,每一個季度添加的藥品數量,或者按照月份爲維度,顯示對應藥品添加數量. .net
通常來說在數據庫中不會有一個單獨的字段去存儲月份或者季度這樣的信息,而是有一個日期的字段記錄全部的這些信息.這裏咱們能夠利用SQL語句,經過SQL函數生成咱們須要的月份和季度的列.也可使用更加簡單的方式,在BIRT的DataSet中,經過Computed Columns計算出咱們須要的列.(推薦)
如今經過計算出的列,獲得季度和月份的列,表達式部分如圖:
月份表達式:
如此,將計算出來的列做爲維度,建立Cube,而後製做圖表,看到效果以下:
能夠看到結果是1,3,2,4的排序,不是咱們但願的1,2,3,4.一樣這種問題在月份爲維度的時候也存在.在使用交叉表的時候,也會遇到這個問題.
這個緣由多是和字符串的排序有關,這裏作一些處理,規避掉這種錯誤的順序,首先改變DataSet中季度那一列的表達式,以下:
而後將圖表中,X軸綁定的表達式以下書寫:
再來看結果以下:
這時顯示是正確的了,經過對錶達式的操做,能夠實現不少咱們須要的功能.
6. Birt標籤在JSP中的使用.
<birt:viewer> 會顯示分頁和報表頭上導出等一些按鈕, 此時是對應會有一個frameset.
<birt:report> 對應一個preview的模式,不會有分頁和報表頭的那些導出項.
<birt:param> 做爲上面二者的子標籤,能夠傳遞參數.
在頁面上方引入tld標籤庫,<%@ taglib prefix="birt" uri="/birt.tld" %>
這個很容易設置是否顯示工具欄,大小的一些設定,同時省去了咱們額外在JSP頁面中添加iframe.
大致上能夠以下書寫:
<birt:report id="r1" reportDesign="/reports/r1.rptdesign" isHostPage="false" position="static" width="1800" height="2000" format="html"> <birt:param name="param1" value="1"/> </birt:report>
7. 統一數據源鏈接,從properties文件中讀取配置信息鏈接數據源
在Birt與SSH集成後,由於數據庫是同一個,要從一個配置文件讀取配置信息.以一個報表文件爲例,若是要從配置文件讀取信息並建立數據源鏈接,首先要建立一個數據源鏈接,能夠直接建立一個Birt內置的示例數據庫或者是JDBC數據庫,都沒有關係.而後選中數據源,點擊腳本頁,在beforeOpen上寫入如下代碼:
importPackage( Packages.java.io,Packages.java.util,Packages.java.net ); importPackage( Packages.javax.servlet.http ); req = reportContext.getHttpServletRequest(); propPath = new String("/WEB-INF/con_db.properties"); if ( propPath.charAt(0) != "/" ) { propPath = "/" + propPath; } url = req.getSession().getServletContext().getResource(propPath); if ( url != null ) { props = new java.util.Properties(); props.load( url.openStream() ); this.setExtensionProperty("odaURL", props.getProperty("url")); this.setExtensionProperty("odaDriverClass", props.getProperty("driver")); this.setExtensionProperty("odaUser", props.getProperty("username")); this.setExtensionProperty("odaPassword", props.getProperty("password")); }
這樣就能夠了,可是接下來使用,在報表設計工具中會有各類錯誤,數據集,立方體都沒法根據這個數據源建立,也就沒法設計圖表.緣由是這裏面對於properties文件的讀取,只支持盤符文件夾的絕對路徑,咱們這裏經過reportContext上下文將其定位到WebRoot的相對路徑下,可是req須要運行時環境,因此在設計的時候會有一系列錯誤.
解決的方法是,開發中咱們建立一個庫文件,存放各個數據源和數據集立方體等,全部的報表引用這個庫數據源鏈接,直接連服務器,報表設計開發完畢後,直接將庫數據源轉爲讀取properties文件便可.