不定列(動態列)報表的資料來源處理,報表
動態列報表是動態報表的一種,在報表應用中很常見。這類報表由於無法事先確定列數,因而無法在報表中使用固定列的運算式,而且更加棘手的是報表資料來源的準備,因為SQL不支援不定列的結果集,需要動態拼出SQL語句去執行,有時商務邏輯並不很簡單,還需要使用預存程序分步完成。而預存程序對集合運算的支援不夠,難以使用中間結果(要用暫存資料表),導致完成這類運算並不輕鬆。
像http://bbs.csdn.net/topics/390937222?page=1#post-398564938中提到的問題,就是一個比較典型的動態列計算問題,這類計算往往是為前台報表格服務的,使用SQL和預存程序都很難完成,而一般的報表工具由於不具備強計算能力,對於這類計算更加無法完成。
使用潤乾集算報表來做則比較簡單,集算報表不僅繼承了潤乾報表在呈現層面處理動態列資料來源的能力,而且內建了強大的資料來源計算引擎,在運算和格式兩方面都能很好地支援動態列報表。
這裡以上述連結中的實際業務為例,給出集算報表的實現方案。
報表背景
來源資料如下:
現需要在報表中以機組為單位,橫向排列類別和產量,樣式如下:
這個報表的痛點在於用SQL或預存程序寫起來很困難,而一般報表工具則不具備資料來源計算能力,根本無法實現。集算報表本身內建了適合結構化計算的指令碼,可以方便地寫出資料準備的計算(相當於一種更使用更簡單的自訂資料集)。上述報表需求使用集算報表可以這樣完成:
編寫集算指令碼
首先使用集算指令碼編輯器,建立集算指令碼,編寫指令碼完成資料計算,為報表輸出計算後結果集。
上述指令碼含義:
A1:串連資料來源;
A2:執行sql從產量表中取數;
A3:按機組分組,在集算器中分組結果保留了分組結果(成員)以方便後續使用和計算,這個分組結果如下:
A4:求分組中最大成員個數,以確定結果集列數;
A5-A6:建立結果序表,記錄為空白;
A7-B8:迴圈A3中分組結果,將每個分組中的類別和產量寫入新結果序表中;
A9:為報表返回結果集。
編輯報表範本
使用集算報表編輯器,編輯報表範本,用於資料展現。建立報表並設定集算器資料集,調用上述編輯好的指令檔。
其中,dfx檔案路徑既可以是絕對路徑,也可以是相對路徑,相對路徑是相對選項中配置的dfx主目錄的。
編輯報表運算式,用集算報表的動態資料源機制完成報表製作。
由於是動態列,在報表中要使用ds.field()函數根據列數來動態取得列資料,第一行和A列為輔助行列,設定其隱藏即可。
報表展現結果如下:
可以看到,比起SQL使用集算器指令碼可以快速完成這類動態列報表資料來源。而且外置的集算指令碼具有可視化的編輯調試環境,編輯好的指令碼還可以複用(被其他報表或程式調用)。不過,如果指令碼已經調試好,而且不需要複用的時候,要維護兩個檔案(集算指令碼和報表範本)的一致性會比較麻煩,這時候直接使用集算報表的指令碼資料集就比較簡單了。
在指令碼資料集中可以分步編寫指令碼完成計算任務,文法與集算器一致,還可以直接使用報表定義好的資料來源和參數。本例使用指令碼資料集可以這樣完成:
1. 在資料集設定視窗中點擊“增加”按鈕,彈出資料集類型對話方塊,選擇“指令碼資料集”;
2. 在彈出的指令碼資料集編輯視窗中編寫指令碼;
這裡可以看到,在指令碼資料集中直接使用了報表中定義好的資料來源emos,比起單獨的集算指令碼更加簡單、直接。
3.報表範本和運算式與使用集算器資料集方式一致,不再贅述。