中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

如何實現報表數據的動態層次鉆取(二)

發布時間:2020-08-07 15:17:32 來源:ITPUB博客 閱讀:133 作者:rqgxy 欄目:編程語言

《如何實現報表數據的動態層次鉆取(一)》 介紹了利用復雜 sql 實現動態層次結構的方法,但該方法依賴 Oracle 的遞歸語法,在其他類型的數據庫中難以實現。要想通用地實現此類報表,可以使用下面介紹的“集算腳本 + 本地文件”的方法。

《各級部門 KPI 報表》的格式和具體要求參見上一篇文章。有所不同的是,報表數據源從數據庫表變為本地文件:tree.b(樹形結構維表)和 kpi.b(指標事實表),數據示例如下圖:

如何實現報表數據的動態層次鉆取(二)

Tree 文件數據

如何實現報表數據的動態層次鉆取(二)

Kpi 文件數據

說明:Tree 的葉子節點,通過 id 字段與 kpi 表關聯。KPI 文件每個 ID 每天都會新增 kpi 記錄,總數據量較大。

具體實現步驟如下:

第一步   編寫集算腳本 tree.dfx,完成源數據計算,輸入參數為當前節點號 id。

集算腳本如下:

  A B C
1 =[“省”,“地市”,“區縣”,“營業部”]|to(4,13).(“架構”+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:新建一個序列,內容是各層節點的 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


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

清水河县| 苏尼特右旗| 庐江县| 望奎县| 宿州市| 宜宾市| 盐津县| 高邑县| 金山区| 东乌珠穆沁旗| 宣城市| 克东县| 太仆寺旗| 武邑县| 福贡县| 湘乡市| 宁晋县| 彭州市| 廊坊市| 吉安市| 库车县| 牡丹江市| 抚宁县| 扬中市| 桑植县| 南皮县| 淮南市| 晴隆县| 陇南市| 于田县| 措勤县| 漾濞| 津南区| 大埔区| 临夏县| 托里县| 普兰县| 荥阳市| 金溪县| 伊宁市| 大关县|