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. 效果预览
4.1 PC 端
4.2 移动端
5. 已完成模板
已完成模板请参照:%FR_HOME%\webroot\WEB-INF\reportlets\doc\Advanced\GroupReport\不规范组织树报表.cpt
点击下载模板:不规范组织树报表.cpt