在報表開發實例——動態多層次KPI鑽取報表(I)中,我們說到了動態層次報表需要層次鑽取的場景,並介紹了利用oracle復雜sql的實現方法。這裡仍然通過該報表來了解一下使用“腳本+本地文件”的開發方法。
各級部門KPI報表的格式和具體要求參見(I)。有所不同的是,報表數據源從數據庫表變為本地文件:tree.b(樹形結構維表)和kpi.b(指標事實表),數據如下圖:
<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHAgYWxpZ249"center">Tree文件數據
Kpi文件數據
Tree的葉子節點,通過id字段與kpi表關聯。KPI文件每個ID每天都會新增kpi記錄。
采用潤乾集算報表實現的第一步:編寫集算腳本tree.dfx,完成源數據計算,輸入參數為指定當前節點號id。集算腳本如下:
A1:新建一個序列,內容是各層節點的title:“省、地市、區縣、營業部、架構4、架構5、架構6. . . 架構13”。
B1:讀入tree.b的數據。
C1:新建一個文件游標,連接kpi.b文件。使用游標分段讀取數據,適用於kpi.b較大,無法一次裝入內存的情況。
A2:將B1的PID字段切換成B1自己的引用,條件是PID=ID。
B2:在B1中取出指定id對應的記錄。
C2:使用prior函數,查找C2自己和所有祖先節點,順序反轉。
A3:用C2生成新序表,字段是ID、NAME和A1中對應的組織結構。
B3:定義變量xtitle賦值為指定id對應下一層節點的title。
C3:在B1中找出B2的直接子節點。
A4:如果C3沒有成員,說明當前節點是葉子,用B1的結構新建一個序表(只有一條空記錄)。否則,直接將C3賦值給A4。
B4:用B1生成新序表,字段是ID、GID(分組id)。GID是用prior函數找到當前每條記錄到祖先B2的路徑。之後去掉GID為空的記錄,也就是非B2子孫的記錄。
C4:循環將B4的GID賦值為所有祖先中的倒數第二個,也就是當前id的子節點。
A5:將C1的ID字段切換成C4對應記錄,去掉找不到ID對應值的記錄,也就是非B2子孫的葉子。
B5:對A5按照ID.GID分組,匯總kpi。
C5:將B5與A4對齊。
A6:用C5生成新序表。如果id是葉子的話,id、name為空,方便報表隱藏列,避免葉子顯示兩次。
B6:向報表返回兩個結果集。
制作過程的第二到四步這裡不再贅述,參見前文報表開發實例——動態多層次KPI鑽取報表(I)。
這個代碼以本地文件作為數據源編寫,能夠很容易地改造成使用數據庫作為數據源,從而可以在那些不支持遞歸查詢的數據庫上實現此類報表。