溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何實(shí)現(xiàn)報(bào)表數(shù)據(jù)的動(dòng)態(tài)層次鉆?。ǘ?/h1>
發(fā)布時(shí)間:2020-08-07 15:17:32 來源:ITPUB博客 閱讀:133 作者:rqgxy 欄目:編程語言

《如何實(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ù)示例如下圖:

如何實(shí)現(xiàn)報(bào)表數(shù)據(jù)的動(dòng)態(tài)層次鉆?。ǘ?>
</p>
<p>
Tree 文件數(shù)據(jù)
</p>
<p>
<img src=   A B C 1 =[“省”,“地市”,“區(qū)縣”,“營業(yè)部”]|to(4,13).(“架構(gòu)”+string(~)) =file(“D:\\files\\tree.b”).import@b() =file(“D:\\files\\kpi.b”).cursor@b() 2 =B1.switch(PID,B1:ID) =B1.select@1(ID==string(id)) =B2.prior(PID).rvs() 3 =C2.new(ID,NAME,A1.m(#):title) >xtitle=A1.m(A3.len()+1) =B1.select(PID==B2) 4 =if(C3.len()>0,C3,B1.create().insert(0)) =B1.new(ID, ~.prior( PID, B2):GID ).select( GID) =B4.run(GID=GID.m(-1).ID ) 5 =C1.switch@i(ID,C4:ID) =A5.groups(ID.GID:ID;sum(KPI1):KPI1,sum(KPI2):KPI2,sum(VIPKPI1):VIPKPI1,sum(VIPKPI1):VIPKPI2) =B5.align(A4:ID,ID) 6 =C5.new(A4(#).ID:ID,A4(#).NAME:NAME,xtitle:TITLE,KPI1:KPI1,KPI2:KPI2,VIPKPI1:VIPKPI1,VIPKPI2:VIPKPI2) return A3,A6

代碼說明:
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


向AI問一下細(xì)節(jié)

免責(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)容。

AI