在製作業務報表時,經常會遇到一些單獨依靠報表工具難以解決的問題。本文將針對幾個 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...