關聯跨行計算報表的製作,關聯跨計算報表
實際資訊系統中很多資料計算是為前端展示而進行的,其中報表是最常見的一種形式。這些計算的實現過程往往並不簡單,使用SQL或預存程序實現起來比較困難,從而影響到前端報表設計。像http://bbs.csdn.net/topics/390813196中提的問題,其目的往往是為了實現一個供生產或採購部門使用的報表(包含庫存覆蓋周期,方便生產調度或實施採購任務),用SQL寫起來會比較麻煩,一般報表工具又不具備很強的計算能力,也無法直接完成。而潤乾集算報表則有很靈活的計算能力,可以充分利用問題特點應付各種非常規的計算需求。這裡就以連結中業務為背景,給出集算報表實現這種計算庫存覆蓋周期(關聯跨行運算)報表的方案。
報表背景
來源資料如下:
如上兩表,庫存表記錄當前庫存,庫存需求表為每月產品的需求,求當月庫存能覆蓋幾個月。舉例:
如201401月C111庫存為100,
201401月庫存需求20,即100-20=80,
201402月庫存需求20,即80-20=60,
201403月庫存需求50,即60-50=10,
201404月庫存需求20,即10-20=-10,無法滿足需求。
即201401月C111庫存只能覆蓋3個月,周期為3。
報表樣式如下:
這個報表的痛點在於需要根據產品編碼去庫存需求表中匹配相應資訊後,迴圈比較庫存需求和當前庫存數量,從而計算出庫存覆蓋周期。在SQL中完成類似的迴圈計算比較麻煩,而一般報表工具不具備資料來源計算能力,需要在報表中完成計算。例如用潤乾報表會這樣實現:
使用潤乾報表完成這個報表時,需要藉助臨時變數(對於無法使用臨時變數的報表工具來說實現就更加困難)、隱藏格(E G H三列為輔助列,需隱藏),以及多資料來源的方案。在增加報表實現難度的同時,由於資料來源要多次被遍曆,而且使用了很多擴充的隱藏格,報表效率較低且難以理解維護。
集算報表內建了適合結構化計算的指令碼,可以事先將資料準備好(相當於一種更使用更簡單的自訂資料集),報表工具只要簡單地取數展現即可。上述報表需求使用集算報表可以這樣完成:
編寫集算指令碼
首先使用集算指令碼編輯器,建立集算指令碼,設定指令碼參數:年份。
編寫指令碼完成資料補齊操作,為報表輸出計算後結果集。
A1:串連資料來源;
A2:執行取數sql,根據年份參數取得庫存需求資料,並按時間排序;
A3:執行取數sql,取得庫存資料,並增加欄位庫存覆蓋周期欄位(c_count),值初始化為0;
A4-B6:迴圈庫存表,根據指定產品編碼遍曆庫存需求表,計算得到庫存覆蓋周期,並將其更改A3中的c_count值,邏輯過程很清晰,易於理解和維護;
A7:為報表返回結果集。
編輯報表範本
使用集算報表編輯器,編輯報表範本,用於資料展現。串連報表預設資料來源demo。
建立參數,並設定預設值。
建立報表並設定集算器資料集,調用上述編輯好的指令檔。
其中,dfx檔案路徑既可以是絕對路徑,也可以是相對路徑,相對路徑是相對選項中配置的dfx主目錄的;報表範本參數和指令碼參數均為ym,事實上二者可以不同名。
編輯報表運算式,這時只要採用普通的網格式報表製作方法取數展現即可:
報表展現結果如下:
如果指令碼已經調試好,且不需要複用的時候,還可以直接使用集算報表的指令碼資料集,其中可以直接使用報表定義好的資料來源和參數,過程更為簡單:
1.在資料集設定視窗中點擊“增加”按鈕,彈出資料集類型對話方塊,選擇“指令碼資料集”;
2.在彈出的指令碼資料集編輯視窗中編寫指令碼;
在指令碼資料集中直接使用了報表中定義好的資料來源demo和參數ym,比起單獨的集算指令碼更加簡單、直接。
3.報表範本和運算式與使用集算器資料集方式一致,不再贅述。