JasperReport報表開發之轉置交叉表

2022-09-18 21:30:12 字數 3058 閱讀 6456

使用jasper或birt等報表工具時,常會碰到一些很規的統計,用報表工具本身或sql都難以處理,比方源資料不符合交叉表的要求,須要轉置後再呈現。

集算器具有結構化強計算引擎,整合簡單。能夠協助報表工具方便地實現此類需求。以下通過乙個樣例來說明轉置交叉表的實現過程。

資料庫表booking彙總著各年度商品的預定資料。有四個字段,包含年份和三種預定狀態,部分資料例如以下:

報表要求呈現指定年份及上一年的預定情況。當中行組有三項,即三種預定狀態,列組是年份。測度是當年的預定資料。此外要彙總出指定年份各預定狀態的增長率。表例子如以下:

能夠看到,這張報表的難點是:源資料無法直接用於交叉表,彙總列要用相對位置來動態計算。

假設能將源資料轉置。並將彙總列事先計算出來,則會顯著減少難度,比方以下這樣:

以下用集算器準備報表所需的資料,**例如以下:

yearend是來自報表的引數,表示使用者指定的年份,比方2014。a1中的**用來計算上一年(比方2013),為了方便引用,上一年定義為yearbegin。

a2=mydb1.query(「select * from booking where year between ? and ?

order by year desc」,yearbegin,yearend)

這句**用來從資料庫查出指定年份及上一年的資料。mydb1是資料來源名,指向mysql。函式query可執行sql語句,也能夠接受引數。如果yearend=2014,則a2的計算例如以下:

a3=create(row,col,value)

這句**用來新建序表a3。

須要注意的是。序表類似資料庫結果集,也是結構化二維表。但序表是泛型的,同乙個字段能夠儲存不同的資料型別,序表也是有序的,能夠按序號訪問資料。

利用序表的這些特點能夠方便地實現本案例。

a4: for ["visits","bookings","successfulbookings"]

這句**對集合["visits","bookings","successfulbookings"]進行迴圈訪問,在迴圈中向a3追加資料。終於準備出報表須要的資料。

for語句的作用範圍是b4-c7,用自然的縮排就能夠表示。無需括號或begin/end等標記。

在作用範圍裡能夠用a4來引用迴圈變數,即for語句所在單元格的格名。比方進行第一遍迴圈時。a4的值等於」visits」。

以下看迴圈體中的**。

b4=endvalue=eval(「a2(1).」+a4)

這句**可從a2動態地取出第一條記錄的預定狀態資料。

函式eval可將字串解析為表示式,比方第一遍迴圈時。「a2(1).」+a4會被解析為a2(1).visits,計算結果是500。當中「a2(1)」表示第一條記錄,「.visits」表示取出該記錄的visits欄位。即下圖紅框處:

c4=beginvalue=eval(「a2(2).」+a4)

和endvalue類似,beginvalue從a2中動態地取出第二條記錄的預定狀態資料。第一遍迴圈時,endvalue等於400。

b5=a3.insert(0,a4,a2(1).year,endvalue)

c5=a3.insert(0,a4,a2(2).year,beginvalue)

這兩句**向a3追加記錄。函式insert能夠向序表插入記錄。第乙個引數能夠指定插入的位置,假設這個引數為0,則表示在最後追加記錄。

比方第一遍迴圈時,b5追加的記錄是:」visits」、2014、500,c5追加的記錄是」visits」、2013,400。追加後a3例如以下:

b6=endvalue/beginvalue-1

這句**計算指定年份的增長率,比方第一遍迴圈時,b6=500/400-1=0.25。

c6=if(b6>0:」+」,b6<0:」-」)+string(b6,」#%」)

這句**用來格式化b6。演算法是:假設b6大於0,則在百分數前面加「+」號,假設小於0,則加「-」號。比方第一遍迴圈時,c6=」+25%」。注意:格式化資料適合用報表實現,所以本步驟並不是必須。

b7=a3.insert(0,a4,string(yearend)+」/」+string(yearbegin),c6)

這句**向a3追加新記錄,比方第一遍迴圈時,插入的記錄是」visits」,」2014/2013」,」+25%」。例如以下圖:

值得注意的是。這次插入的記錄都是字串。和之前的型別不同。

整個迴圈執行後,報表須要的資料就會所有追加在a3中,例如以下:

這句**將a3返回給報表工具。集算器對外提供jdbc介面。報表工具會將集算器識別為普通資料庫,整合方案請參考相關文件。

接下來以jasperreport為例設計一張簡單的交叉表。模板例如以下:

報表中須要定義乙個引數pyearend,用來相應集算器中的引數。

預覽後能夠看到報表結果:

報表呼叫集算器的方法和呼叫儲存過程一樣。比方將本指令碼儲存為booking.dfx,則在jasperreport的sql設計器中能夠用booking $p來呼叫。

Java列印JasperReport報表

使用資料庫作為資料來源列印報表,匯出成pdf格式。原始碼 演示報表效果用 列印報表到pdf格式 public class jasperprintdemo catch sqlexception e 列印報表 param filepath jrxml檔案路徑 param destfile 目標路徑 pd...

急!!!jasperreport報表匯出的問題

再做jasper報表的匯出時遇到了問題,在生成量兩張報表分別匯出的時候,一張可以成功匯出,另一張jasper丟擲如下異常 該異常處 為 public jasperprint fillreportend catch jrexception e return jasperprint 呼叫的jasper的...

Dynamics CRM Report 報表開發

microsoft sql server report builder 在dynamics crm 中,報表匯入時,可以選擇分類,分類包括類別,相關記錄型別,顯示於。類別 是指報表檢視的類別,可以通過該選項將報表掛在不同檢視下。報表類別的新增路徑 設定 系統設定 報表類別。顯示於 選擇相關記錄型別的...