反饋已提交
網絡繁忙
組織樹報表 中由 ID 與父 ID 來實現組織樹報表,若層級數較多時,對每個儲存格設定過濾條件和形態會比較繁瑣,因此 FineReport 提供了一種特殊的資料集——樹資料集,只需要簡單的設定就能自動遞迴出層級,方便的實現如下圖組織樹報表:
圖一:縱向組織樹
圖二:橫向組織樹
一般分兩步構建樹資料集:
1)新增帶有層次關係的普通資料集;
2)基於普通資料集構建樹資料集。
新增資料集 ds1 取出原始資料,SQL 語句為:SELECT * FROM 公司部門。
使用情形:原始表結構中符合 ID、parentID 結構,我們可以透過父 ID 這個欄位生成樹,新增樹資料集,如下圖。
需要特別強調的是,此種情況,需要有唯一根節點(就是下圖 parentID 為空的節點)。如果沒有,那麼構建樹時會無法正常建立索引,最後在前台使用下拉樹元件時容易出現一些功能問題,比如元件不能給預設值、比如不能模糊搜尋等。
使用情形:原始表結構中所有ID都在一欄中,且沒有父 ID 欄位,但是 ID 是有規律的,每組的長度相同,且子級的前N位就是父級編號,新增樹資料集,如下圖:
預覽樹資料集,可看到已自動生成遞迴樹資料,FR_GEN_0為最高層,依次往下,如下:
按照下圖所示將對應的資料列拖入到儲存格中,預設儲存格縱向擴展並設定左父格:A2 儲存格的左父格設定為 A1,A3 儲存格的左父格設定為 A2,如下圖所示:
有上面預覽資料可以看到從二層 FR_GEN_1 開始,就會有空白資料,這是因為資料庫中儲存的資料有上一級部門本身的部門名稱和部門 ID,其上一級部門的部門級數會低一級,比如說上述資料的第一行為總部,雖然總部下面有子部門,但是資料庫中還是要儲存總部這個部門的部門名稱和部門ID的,總部對應的級數為一級,那麼其對應的資料記錄行裏面就只有FR_GEN_0 層,下面的 FR_GEN_1和FR_GEN_2 這兩層就會沒有資料,顯示為空白。
在範本製作程式中,從第二層級開始就會有空白資料,需要將空白資料隱藏掉,選中 A2 和 A3 儲存格,新增條件屬性,當資料為空時隱藏該行,如下圖:
注:如果組織結構的層級結構不確定,即有的層級有子層,有的層級沒有子層時,其組織樹報表的實現方式請查看:不規範組織樹報表
由於自動生成的欄位是編碼,可以使用資料字典將其轉為對應的部門名稱,如下圖:
如概述中圖一所示。
App 與 HTML5 端效果相同,如下圖所示:
已完成的範本可參見:%FR_HOME%\webroot\WEB-INF\reportlets\doc\Advanced\GroupReport\樹資料集組織樹報表.cpt。
點選下載範本:樹資料集組織樹報表.cpt
按照下圖所示將對應的資料列拖入到儲存格中,設定儲存格橫向擴展並設定父格:B1 儲存格的左父格設定為 A1,C1 儲存格的左父格設定為 B1,如下圖所示:
有上面預覽資料可以看到從二層 FR_GEN_1 開始,就會有空白資料,這是因為資料庫中儲存的資料有上一級部門本身的部門名稱和部門 ID,其上一級部門的部門級數會低一級,比如說上述資料的第一欄為總部,雖然總部下面有子部門,但是資料庫中還是要儲存總部這個部門的部門名稱和部門ID的,總部對應的級數為一級,那麼其對應的資料記錄列裏面就只有FR_GEN_0 層,下面的 FR_GEN_1和FR_GEN_2 這兩層就會沒有資料,顯示為空白。
在範本製作程式中,從第二層級開始就會有空白資料,需要將空白資料隱藏掉,選中 B1 和 C1 儲存格,新增條件屬性,當資料為空時隱藏該列,如下圖:
注意因為是橫向的,所以應該是列寬而不是行高!
如概述中圖二所示。
建立資料庫查詢資料集 ds1,然後資料集 ds1 裏 “call 儲存程式名 儲存程式參數”,再用 ds1 生成樹資料集 。
注:若是呼叫資料庫儲存程式取數,官方只支援查詢語句 select 進行取數,其他寫法(例如下面的寫法), 傳回的結果不能保證,不建議使用 。
具體操作步驟如下:
建立一個資料庫查詢,輸入:{call username.package.procedure('${p1}','${p2}','${p3}',?)},然後設定下參數的初值,這樣就產生了一個普通的資料集 ds1。再透過資料集 ds1,設定樹資料集就好了,此時就可以正常生成樹資料集了,如圖:
儲存程式直接生成樹資料集無效,如圖:
評論中很多人問到了層級未知的情況。我們不妨用遞迴的思路來梳理一下什麼是組織樹:資料之間是有明顯父子關係的。
從某個層級開始假如我們向上遞迴尋找,總能找到有限的父層級,這時候不存在層級未定,我們以最大的父層級作為層級數。
假如我們向下遞迴尋找,實際情況當中子層級也是有限的,假如出現子層級不斷增長的情況,無論增長到多少級,最終也能找到最深的那個子層級。
滑鼠選中內容,快速回饋問題
滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。
不再提示
10s後關閉
反馈已提交
网络繁忙