解決 Jasper 等報表工具製作報表中的幾個難題

2021-09-24 16:52:22 字數 3740 閱讀 8810

在製作業務報表時,經常會遇到一些單獨依靠報表工具難以解決的問題。本文將針對幾個 jasper 報表工具使用者在國外論壇中提出的現實問題,介紹如何用集算器 spl 語言加以解決的方案。這裡的解決方案其實並不僅適用於 jasper,對其它報表工具也同樣適用。

資料檔案 data.csv 儲存著某賬戶各期資金訪問情況,在已知賬戶初始餘額為 43 的情況下,需要根據該檔案計算出各期餘額,部分源資料如下:

inputs,outputs

0,10

15,0

22,0

0,33

0,15

0,14

36,0

0,69

2,018,0

想要得到的報表結果如下:

根據訪問金額計算各期餘額時需要進行跨行計算,可以用 jasper 表示式實現,但實現步驟複雜且有一定難度,而通過集算器協助 jasper 則可以輕鬆實現。具體的集算器 spl **如下:

a

1=file("data.csv").import@tc()

2return   (t=43,a1.derive(t=t+inputs-outputs:balance))

a1   讀入檔案,選項 @tc 表示檔案有標題行、以逗號為分隔符。

a2   計算各期餘額並將計算結果返回給報表。其中,設定賬戶初值 t 為 43,然後在 a1 序表中增加乙個計算列,其值為上期餘額 + 本期流入 - 本期流出。顯然這裡的計算結果就是希望報表呈現的內容。

將以上 spl **存為檔案 balance.dfx。

為了在報表中呈現計算結果,可以利用集算器對外提供 jdbc 介面。在報表工具中通過建立 jdbc 資料來源引入集算器指令碼,而報表呼叫集算器定義的方法和呼叫儲存過程一樣,在 jasper 的 sql 設計器中可以用 call balance() 來呼叫並傳入引數。詳細步驟請參看《jasperreport 呼叫 spl 指令碼》。

然後,在 jasper 中設計最簡單的 list 表,模板如下:

預覽後可以看到報表結果,和我們要求的一樣:

資料庫表 loan 儲存著貸款資訊,包括貸款總額、按月分期數、年利率。要求實現一張分組表,在每條貸款資訊下列出各期明細,包括:當期還款額、當期利息、當期本金、剩餘本金。

表 loan 的部分資料如下:

loanid

loanamt

term

rate

l01100000

54.75

l022000025

l03500000

124.5

想要得到的報表結果如下圖:

根據貸款額計算貸款分期時需要進行迴圈計算和跨行計算,用儲存過程或 scriptlets 實現的難度較大,而同樣使用集算器協助 jasper 就可以輕鬆實現。編寫集算器 spl **如下:

a

1=db.query("select   * from loan")

2=a1.derive(rate/100/12:mrate,loanamt*mrate*power((1+mrate),term)/(power((1+mrate),term)-1):mpayment)

3=a2.((t=loanamt,term.new(a2.loanid:loanid,   a2.loanamt:loanamt, a2.mpayment:payment, a2.term:term,a2.rate:rate,   t*a2.mrate:interest, payment-interest:principal,   t=t-principal:principlebalance)))

4=a3.conj()

5return   a4

a1   執行 sql,取出 loan 中的記錄。

a2   在序表 a1 中新增計算列月利率 mrate 和每期還款額 mpayment。結果如下:

a3   根據貸款資訊計算各期明細。a2.()是迴圈函式,可對 a2 的成員依次進行計算,「()」內的**將分步計算,最終返回最後乙個逗號的計算結果。其中函式 new 用來生成新的二維表。a3 的計算結果是層次資料,如下:

a4   合併層次資料,形成分期明細二維表。

a5   返回結果給報表。

同樣,在 jasper 中可以設計一張簡單的分組表,模板如下:

預覽後就可以看到需要的的報表結果了。

資料庫表 store 儲存著多種產品在 2014、2015 年的銷售量,需要用交叉表呈現每種產品每年的銷售量,並計算出各產品的年增長率。部分源資料如下:

year       item       quantity

2014   book   35

2015   pencil 50

2014   pencil 56

2015   book   67

想要得到如下報表結果:

因為交叉表的每一列都是動態生成的,進行列間計算時又需要動態引用,因此用 jasper 指令碼實現這種需求有一定難度,而用集算器在資料準備階段實現相應的計算就相對簡單很多。集算器 spl **如下:

a

1=mydb.query("select   * from store order by item,year")

2=a1.group(item).run(a1.record(["growth   rate",item,~(2).quantity/~(1).quantity-1]))

3return   a1

a1   取出 store 表的記錄。

a2   追加各產品的年增長率。其中,group 按產品分組,run 對每組資料依次計算,record 追加記錄,~(i)表示當前組中的第 i 條記錄。

a3   將計算結果返回給報表。

在 jasper 中設計最簡單的交叉表,模板如下:

預覽後可以看到報表結果:

Jasper報表製作小技巧

安裝開啟後介面布局及部分快捷鍵說明如下 報表結構 title title 段只在整個報表的第一頁的最上面部分顯示,除了第一頁,不管報表中有多少個頁面也不會再出現title band 中的內容。就是報表的標題。pageheader pageheader 段中的內容將會在整個報表中的每乙個頁面中都會出現...

SAP BO 報表工具

隨著大資料時代的來臨,bi分析工具也熱火朝天的發展起來。由於一直在做sap的bi產品,所以主要圍繞著sap bo提供的報表工具做乙個簡單的選型介紹。目前sap bo提供了下列元件供我們選擇 crystal report 固定格式報表,財務三大表的優秀載體,但是不支援即席查詢。web intellig...

商務智慧型報表工具

商務智慧型 bi 解決方案 artm report 是乙個b s 方式的基於 olap 的多維資料集展現工具。能夠提供給使用者乙個靈活的報表定義和資料分析平台,為使用者提供豐富的資料展現形式和強大的資料分析功能。artm report 能夠讓使用者在客戶端輕鬆地訪問 分析 sql server an...