1. 概述
在實際應用中,除了規範的組織結構外還有不規範的組織結構。如下圖用 2 個範例來展示這兩種組織樹的差別:
1)規範的組織結構:除了最後一層外,所有其他層的結構都有子層。比如,自帶資料連結 FRDemo 中的“公司部門”表資料;
2)不規範的組織結構:有的層級結構下面有子層,有的層級結構下面沒有子層,即層級結構不確定。比如,一個公司的公司結構,有總部、人力資源部、市場部等,人力資源部下面還有人力一部,人力二部,人力一部下面才是具體員工,而市場部下面直接就是具體員工。
圖一:規範的組織結構
圖二:不規範的組織結構
使用不規範的組織結構構建組織樹報表,如果還是透過 組織樹報表 這種方式來實現就會出現上圖所示的狀況,即沒有子層資料的層級的子層會顯示空白。
那麼如何讓沒有子層資料的層級資料合併其下面所有層級儲存格顯示呢?如下圖效果:
2. 實現思路
要實現沒有子層資料的層級資料合併其下面所有層級儲存格顯示,則將沒有子層資料的結構所在層級儲存格向下(橫向擴展向下,縱向擴展向右)合併至最後一層;將該層級資料列拖曳進來,使該儲存格擴展出相應層級的所有資料;同時新增過濾條件,如果其有子層,資料就過濾掉,顯示為空白,再將空白行或列隱藏。以橫向組織樹為例,如果組織結構總共三層,具體思路步驟:
1)實現規範組織樹:按規範組織結構設計三行,並實現三行分別代表三層;透過條件屬性隱藏沒有子層的列;
2)合併儲存格:增加第二列代表第二層沒有子層,第二列的第二行和第三行儲存格合併,合併儲存格拖入相應第二層;左側儲存格作為該儲存格的上父格;上層儲存格第一欄和第二列合併;
3)條件屬性:合併儲存格後得到的是所有第二層,需要對第二列合併後的儲存格新增過條件屬性,只顯示沒有子層的第二層。
3. 範例
3.1 資料準備
建立內建資料集 ds1,內建資料集中第二層結構中有一個結構沒有子層。如下圖:
3.2 製作範本實現規範組織樹
由於上面準備資料是不規範的組織結構,我們按照 樹狀結構報表 中的方法來實現組織樹,即不使用樹資料集,範本效果如下圖:
A1、A2 和 A3 均橫向擴展,儲存格設定如下表:
儲存格 | 過濾條件 | 形態設定 |
---|---|---|
A1 | parentnode等於空 | 實際值:id 顯示值:name |
A2 | parentnode等於儲存格A1 | 實際值:id 顯示值:name |
A3 | parentnode等於儲存格A2 | 實際值:id 顯示值:name |
注:在新增過濾條件時,需要去掉將父格子作為過濾條件前面的勾選,如下圖 A2 儲存格的過濾條件:
儲存格形態設定詳細請參照 資料字典。
此時儲存範本,可以看到如下圖效果,沒有子層的層級結構並沒有合併儲存格,其子層儲存格還在,但是沒有資料顯示:
注:如果使用樹資料集,請參照:樹資料集實現組織樹報表
透過條件屬性隱藏沒有子層的列:對 A2 和 A3 使用條件屬性: ISNULL($$$) ,如下圖
效果如下圖:
3.3 合併儲存格
從效果圖上可以看到沒有下層的層級結構都被條件隱藏了,需要增加列進行顯示,並且該層與下層儲存格合併。
由於 FineReport 不支援自動合併儲存格,只能手動合併,第二層資料所在儲存格為第二行,最後一層在第三行。
所以新增B列,合併A2後面的儲存格至第三行,即合併 B2 和 B3 儲存格,將拖入 ID 列橫向擴展;設定上父格 A2,過濾只限第二層結構;設定其形態為:實際值為 ds1 的 name 欄位;A1 儲存格是第一層資料,故需要將其顯示在所有資料上面,需要合併 A1 和 B1 儲存格。結果如下圖:
儲存格 | 擴展 | 形態設定 |
---|---|---|
B2 | 橫向擴展 | 實際值: ID 顯示值:name |
預覽效果如下圖(每個第二層後面均跟着一個合併的儲存格,且顯示對應層級資料):
3.4 條件屬性
上面效果圖中,增加的列顯示的是所有第二層,有子層的也顯示了。通對 B2 儲存格設定條件屬性,將有子層的列隱藏,REVERSE(ISNULL(A3)),如下圖所示:
效果如下:
3.5 其他設定
上圖實現的效果是表格的列表頭,再將列表頭對應的資料(untis 資料列)拖曳至第 4 行儲存格中,如下圖:
3.6 更多層組織結構
如果組織結構有 4 層,那麼其範本樣式如下圖。更多層組織結構,類似設計實現。
4. 效果預覽
5. 已完成範本
範本效果線上查看請點選: 不規範組織樹報表.cpt
已完成範本請參照:%FR_HOME%\webroot\WEB-INF\reportlets\doc\Advanced\GroupReport\不規範組織樹報表.cpt
點選下載範本:不規範組織樹報表.cpt