效能最佳化之報表與演算法的統一管理

xiaohuihui發表於2019-12-10

在報表專案中,常常有些複雜的資料計算是一個報表專門使用的,其它報表用不到。通常,此類計算可以在報表資料來源中用 SQL 實現,不過由於 SQL 無法分步計算,需要寫非常複雜難懂的長語句,不利於除錯和維護,因此也會使用 Java 或者儲存過程來實現。但這樣一來,計算程式又會和報表模板分開,不利於組織管理。

使用潤乾報表的指令碼資料集(結合集算器實現)來實現報表專用計算,是解決上述困境的一個有效手段,一方面既可以寫出簡單易懂的分步計算指令碼,另一方面又可以將指令碼和報表模板一起存放,利於管理。

這兩種方式的系統結構對比如下圖所示:

imagepng

下面透過一個具體的報表例子來看一下潤乾報表指令碼資料集的用法。

下表是一個《年度客戶銷售分析報表》,要求可以選擇年份作為輸入引數:

imagepng

其中,CLIENT 是客戶,TOTAL 是客戶銷售總額,DATE1 是客戶最後一次銷售日期,AMOUNT1 是客戶最後一次銷售金額,DATE2 是客戶倒數第二次銷售日期,AMOUNT2 是客戶倒數第二次銷售日期。

1、定義報表引數

在潤乾報表中新建報表模板後,要定義報表引數:

imagepng

2、配置指令碼資料集

定義一個指令碼資料集如下:

imagepng

指令碼資料集編寫如下:

A B
1 =create(client,total,date1,amount1,date2,amount2)
2 =demo.query(“select * from sales where year(ORDERDATE)=”+year)
3 =A2.group(CLIENT)
4 for A3
5
>client=A4.m(1).CLIENT
6
>total=A4.sum(AMOUNT)
7
=A4.sort(ORDERDATE:-1)
8
>date1=B6.m(1).ORDERDATE
9
>amount1=B6.m(1).AMOUNT
10
>date2=B6.m(2).ORDERDATE
11
>amount2=B6.m(2).AMOUNT
12 result A1

程式碼說明:

A1:新建一個空序表,準備存放結果資料。

A2:使用報表的資料來源 demo 用簡單的 sql 取出銷售資料,year 是報表的引數。

A3:對銷售資料按照 CLIENT 分組。

A4:開始對分組資料迴圈處理。

B4:-B11:求結果資料,插入 A1 中,這裡不再詳細介紹。

A12:將結果資料 A1 返回給報表。

3、報表設計

回到報表設計器主介面,報表設計如下圖:

imagepng

儲存為 salary.rpx 即可。可以看到報表設計、計算指令碼編寫都在同一個 rpx 檔案中,管理變得簡單。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2667688/,如需轉載,請註明出處,否則將追究法律責任。

相關文章