處理跨行組運算報表的常用辦法及集算報表解決,運算報表
報表說明
根據訂單表和指定年份(參數)按月統計訂單金額,以及與上一訂單月金額比,與去年同月金額比。報表樣式如下:
這裡需要注意的是——比去年同期是指與去年同月份的比值,無對應月份則為空白;要求只顯示本年資料。
這個報表的麻煩之處在於需要較複雜的資料計算工作,但一般報表工具的計算能力較弱,如果採用報表工具本身來完成這個計算工作則會相當複雜,比如採用用潤乾報表來實現將會是這樣的:
方法一:多資料來源+隱藏列
首先通過兩個資料集分別讀取今年和去年的資料,在報表範本中進行關聯後分別顯示兩年同月的資料,從而完成比較。
資料集設定
通過ds1和ds2分別取今年和去年資料,資料集設定如下:
報表範本及運算式設定
其中,需要設定D列隱藏,以便報表展現時不顯示去年資料。
這種實現方式相對簡單,無需複雜的運算式即可實現,但缺點是由於要使用多資料來源,從同樣資料表中過濾兩次分別輸出兩個資料集,取數效率較低。此外,隱藏列D也會影響報表效能。
方法二:位移座標+隱藏行列
通過按訂購年月分組,使用潤乾報表提供的位移座標,輔助以隱藏行列的方式實現。
資料集設定
資料集參數如下:
報表範本及運算式設定
通過這種方式,通過潤乾報表中層次座標的進階寫法避免了多源,體現了潤乾報表的強大之處,但是仍然要依靠隱藏行列實現,而且E3中計算同期比的計算運算式過於難書寫和理解(要理解主格附屬格的概念、位移座標的使用以及如何在格集運算式中引用當前格的主格),這也給報表開發和維護帶來了困難。
無論是多資料來源,還是層次座標,依賴隱藏行列,都是因為需要在報表中完成同環比計算導致,而往往這樣的計算還比較複雜。這是因為傳統報表工具將資料計算(資料來源準備)和報表轉譯混在一起導致(即使功能強大的潤乾報表也不例外),如果將這兩部分分開,則會使報表開發更加清晰。
另一種辦法是事先把資料計算準備好,報表工具只需要負責呈現和簡單計算。但無論是使用複雜SQL、預存程序和自訂JAVA資料集編程,對於這樣的複雜運算(實際情況往往比這個例子更麻煩得多)都是一件工作量很大的事情,而且難以維護。
集算報表本身內建了適合結構化計算的指令碼,可以方便地寫出資料準備的計算(相當於一種更使用更簡單的自訂資料集)。上述報表需求使用集算報表可以這樣完成。
編寫集算指令碼
使用集算指令碼編輯器編寫集算指令碼,使用系統預設資料來源demo。
編寫指令碼完成同比環比計算(右側為單元格運行格值):
A1:串連資料來源demo;
A2:根據年份參數取出今年和去年兩年的訂單資料;
A3:關閉資料連線;
A4:按訂購日期排序;
A5:按年 月分組,並匯總訂單金額;
A6:計算比上期,這裡注意到使用[-1]來引用上一條記錄;
A7:按月份排序;
A8:計算相同月份和上一年的比值,即同期比;
A9:只選出本年資料,通過A10為報表返回結果集。
編輯報表範本
使用集算報表編輯器,設定資料來源,用於報表預覽。
建立報表範本設定報表參數:
設定集算器資料集,調用上述編輯好的指令檔:
其中,dfx檔案路徑既可以是絕對路徑,也可以是相對路徑,相對路徑是相對選項中配置的dfx主目錄的;參數arg1為指令碼參數,year為報表範本參數,這裡將報表輸入參數傳遞給指令碼用於資料計算,事實上兩個參數可以同名。
報表範本及運算式如下:
可以看到,使用集算器指令碼可以快速完成跨行組運算的報表。而且外置的集算指令碼具有可視化的編輯調試環境,編輯好的指令碼還可以複用(被其他報表或程式調用)。不過,如果指令碼已經調試好,而且不需要複用的時候,要維護兩個檔案(集算指令碼和報表範本)的一致性會比較麻煩,這時候直接使用集算報表的指令碼資料集就比較簡單了。
在指令碼資料集中可以分步編寫指令碼完成計算任務,文法與集算器一致,還可以直接使用報表定義好的資料來源和參數。以上述第二個報表需求為例,使用指令碼資料集可以這樣完成:
1. 在資料集設定視窗中點擊“增加”按鈕,彈出資料集類型對話方塊,選擇“指令碼資料集”;
2.在彈出的指令碼資料集編輯視窗中編寫指令碼;
這裡可以看到,在指令碼資料集中直接使用了報表中定義好的資料來源demo和參數year,比起單獨的集算指令碼更加簡單、直接。
3.報表範本和運算式與使用集算器資料集方式一致,不再贅述。