如何實現報表資料的動態層次鑽取(二)

2021-10-01 19:07:00 字數 1378 閱讀 6146

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 中對應的組織結構。

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:向報表返回兩個結果集。

接下來的第二到四步可以參見《 如何實現報表資料的動態層次鑽取(一) 》,這裡不再贅述,完成後即可實現相應的效果。

通過上述集算器**,可以使用的資料來源不僅限於本地檔案,也可適用於一般資料庫,這樣就可以在那些不支援遞迴查詢的資料庫上通用地實現此類報表了。

如何實現報表資料的動態層次鑽取(二)

tree 檔案資料 kpi 檔案資料 說明 tree 的葉子節點,通過 id 欄位與 kpi 表關聯。kpi 檔案每個 id 每天都會新增 kpi 記錄,總資料量較大。具體實現步驟如下 第一步編寫集算指令碼 tree.dfx,完成源資料計算,輸入引數為當前節點號 id。集算指令碼如下 ab c1 省...

如何實現報表資料的動態層次鑽取(二)

tree 檔案資料 kpi 檔案資料 說明 tree 的葉子節點,通過 id 欄位與 kpi 表關聯。kpi 檔案每個 id 每天都會新增 kpi 記錄,總資料量較大。具體實現步驟如下 第一步編寫集算指令碼 tree.dfx,完成源資料計算,輸入引數為當前節點號 id。集算指令碼如下 說明 a1 新...

動態賦值 如何實現報表資料的動態層次鑽取(二)

tree 檔案資料 kpi 檔案資料 說明 tree 的葉子節點,通過 id 欄位與 kpi 表關聯。kpi 檔案每個 id 每天都會新增 kpi 記錄,總資料量較大。具體實現步驟如下 第一步編寫集算指令碼 tree.dfx,完成源資料計算,輸入引數為當前節點號 id。集算指令碼如下 說明 a1 新...