《如何實現報表數據的動態層次鉆?。ㄒ唬? 介紹了利用復雜 sql 實現動態層次結構的方法,但該方法依賴 Oracle 的遞歸語法,在其他類型的數據庫中難以實現。要想通用地實現此類報表,可以使用下面介紹的“集算腳本 + 本地文件”的方法。
《各級部門 KPI 報表》的格式和具體要求參見上一篇文章。有所不同的是,報表數據源從數據庫表變為本地文件:tree.b(樹形結構維表)和 kpi.b(指標事實表),數據示例如下圖:
A
B
C
代碼說明:
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:向報表返回兩個結果集。
接下來的第二到四步可以參見 《如何實現報表數據的動態層次鉆?。ㄒ唬? ,這里不再贅述,完成后即可實現相應的效果。
通過上述集算器代碼,可以使用的數據源不僅限于本地文件,也可適用于一般數據庫,這樣就可以在那些不支持遞歸查詢的數據庫上通用地實現此類報表了。
詳情鏈接: http://c.raqsoft.com.cn/article/1554695037346?r=gxy
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。