報表開發執行個體——動態多層次KPI鑽研報表(II),kpiii
在報表開發執行個體——動態多層次KPI鑽研報表(I)中,我們說到了動態層次報表需要層次切入的情境,並介紹了利用oracle複雜sql的實現方法。這裡仍然通過該報表來瞭解一下使用“指令碼+本地檔案”的開發方法。
各級部門KPI報表的格式和具體要求參見(I)。有所不同的是,報表資料來源從資料庫表變為本地檔案:tree.b(樹形結構維表)和kpi.b(指標事實表),資料如:
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)。
這個代碼以本地檔案作為資料來源編寫,能夠很容易地改造成使用資料庫作為資料來源,從而可以在那些不支援遞迴查詢的資料庫上實現此類報表。