您好,登錄后才能下訂單哦!
《如何實(shí)現(xiàn)報(bào)表數(shù)據(jù)的動(dòng)態(tài)層次鉆?。ㄒ唬? 介紹了利用復(fù)雜 sql 實(shí)現(xiàn)動(dòng)態(tài)層次結(jié)構(gòu)的方法,但該方法依賴 Oracle 的遞歸語法,在其他類型的數(shù)據(jù)庫中難以實(shí)現(xiàn)。要想通用地實(shí)現(xiàn)此類報(bào)表,可以使用下面介紹的“集算腳本 + 本地文件”的方法。
《各級部門 KPI 報(bào)表》的格式和具體要求參見上一篇文章。有所不同的是,報(bào)表數(shù)據(jù)源從數(shù)據(jù)庫表變?yōu)楸镜匚募簍ree.b(樹形結(jié)構(gòu)維表)和 kpi.b(指標(biāo)事實(shí)表),數(shù)據(jù)示例如下圖:
A
B
C
代碼說明:
A1:新建一個(gè)序列,內(nèi)容是各層節(jié)點(diǎn)的 title:“省、地市、區(qū)縣、營業(yè)部、架構(gòu) 4、架構(gòu) 5、架構(gòu) 6. . . 架構(gòu) 13”。
B1:讀入 tree.b 的數(shù)據(jù)。
C1:新建一個(gè)文件游標(biāo),連接 kpi.b 文件。使用游標(biāo)分段讀取數(shù)據(jù),適用于 kpi.b 較大,無法一次裝入內(nèi)存的情況。
A2:將 B1 的 PID 字段切換成 B1 自己的引用,條件是 PID=ID。
B2:在 B1 中取出指定 id 對應(yīng)的記錄。
C2:使用 prior 函數(shù),查找 C2 自己和所有祖先節(jié)點(diǎn),順序反轉(zhuǎn)。
A3:用 C2 生成新序表,字段是 ID、NAME 和 A1 中對應(yīng)的組織結(jié)構(gòu)。
B3:定義變量 xtitle 賦值為指定 id 對應(yīng)下一層節(jié)點(diǎn)的 title。
C3:在 B1 中找出 B2 的直接子節(jié)點(diǎn)。
A4:如果 C3 沒有成員,說明當(dāng)前節(jié)點(diǎn)是葉子,用 B1 的結(jié)構(gòu)新建一個(gè)序表(只有一條空記錄)。否則,直接將 C3 賦值給 A4。
B4:用 B1 生成新序表,字段是 ID、GID(分組 id)。GID 是用 prior 函數(shù)找到當(dāng)前每條記錄到祖先 B2 的路徑。之后去掉 GID 為空的記錄,也就是非 B2 子孫的記錄。
C4:循環(huán)將 B4 的 GID 賦值為所有祖先中的倒數(shù)第二個(gè),也就是當(dāng)前 id 的子節(jié)點(diǎn)。
A5:將 C1 的 ID 字段切換成 C4 對應(yīng)記錄,去掉找不到 ID 對應(yīng)值的記錄,也就是非 B2 子孫的葉子。
B5:對 A5 按照 ID.GID 分組,匯總 kpi。
C5:將 B5 與 A4 對齊。
A6:用 C5 生成新序表。如果 id 是葉子的話,id、name 為空,方便報(bào)表隱藏列,避免葉子顯示兩次。
B6:向報(bào)表返回兩個(gè)結(jié)果集。
接下來的第二到四步可以參見 《如何實(shí)現(xiàn)報(bào)表數(shù)據(jù)的動(dòng)態(tài)層次鉆?。ㄒ唬? ,這里不再贅述,完成后即可實(shí)現(xiàn)相應(yīng)的效果。
通過上述集算器代碼,可以使用的數(shù)據(jù)源不僅限于本地文件,也可適用于一般數(shù)據(jù)庫,這樣就可以在那些不支持遞歸查詢的數(shù)據(jù)庫上通用地實(shí)現(xiàn)此類報(bào)表了。
詳情鏈接: http://c.raqsoft.com.cn/article/1554695037346?r=gxy
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。