下面就通过数据分析软件FineReport来简单介绍一下组织树报表。
工具/原料
数据分析软件FineReport7.1.1
大小:148.2M适用平台:windows/linux
组织树报表示例
1、描述数据库中比较常见的一种表结构茧盯璜阝就是表中包含了id与parentid两个字段,希望根据这两个字段实现如下图所示的组织树效果:可以看到,组织的每个层次都来自于同一列部痊跬媸应门ID,即同一列的数据之间,存在包含与被包含关系,如何分别获取每一层的数据呢?
2、新建报表,添加数据集新建工作薄,添邹菁惨挣加数据集ds1,SQL语句为SELECT*FROM[公司部门],查询出公司部门表,该表即为典型的id与parentid结构撅掏浑锌。由数据可以看出,该组织结构包含3层,因此我们需要将这三层分别取出来。最终模板效果如下:
3、第一层将部门ID拖拽至A1单元格,默认扩展出所有部门ID,通过过滤条件筛选出第一层部门;由墙绅褡孛数据可以芬简砝鬃看出,第一层上级ID为空,因此选中A1单元格,点击过滤,添加条件上级ID等于'NULL',如下图设置:注:根据数据的不同过滤条件相应改变
4、第二层再次将部门ID拖拽至A2单元格,默认仍会扩展出所有部门ID,设置A2的父格为A1,使谀薜频扰得该级部门ID能够跟随上级部门ID自动扩展;设置父格后会发现,取出的第二层数据与第一层枷讹般身相同:由于设置了父格,AA2中数据列又来自于同一数据集,此时子格默认会将父格作为过滤条件,即会筛选出部门ID=父ID的数据,导致始终选出与上一层相同的部门。因此需要选中A2单元格,点击过滤,去掉将父格子作为过滤条件。同时添加过滤条件上级ID等于'A1',如下图:
5、第三层第三层的原理与第二层相同,进行同样的设置即可。若数据中组织层数不止三层,可以按照相同的方法添加。注:子层单元格必须去掉将父格子作为过滤条件。
6、其他设置模板中使用的是部门ID,若要显示为相应的部门名称,可以通过数据字典进行转换。若某一层中有些有子层,有些没有子层,此时由于扩展会出现一些空白行,可以将空白行隐藏。
树数据集实现组织树报表
1、问题描述组织树报表中由id与父id来实现组织树报表,若层级数较多时,对每个单元格设置过滤条件和形态会比较繁琐,因此FineReport提供了一种特殊的数据集——树数据集,只要要简单的设置就能自动递归出层级,方便的实现如下图组织树报表:
2、新建报表,添加数据集新建工作薄,添加数据集ds1取出原始数据,SQL语句为SELECT*FROM[公司部门]。
3、定义树数据集根据父字段构建树使用情形:原始表结构中符合ID、parentID结构,我们可以通过父ID这个字段生成树,添加树数据集,如下图:
4、根据数据长度构建树使用情形:原始表结构中所有ID都在一列中,且没有父ID字段,但是ID是有规律的,每组的长度相同,且子级的前N位就是父级编号,添加树数据集,如下图:
5、预览数据预览树数据集,可看到已自动生成递归树数据,FR_GEN_0为最高层,依次往下,如下:
6、模板制作按照下图所示将对应的数据列拖入到单元格中,并将A2单元格的左父格设置为A1,A3单元格的左父格设置为A2:
7、条件属性有上面预览数据可以看到从二层掂迎豢畦FR_GEN_1开始,就会有空白数据,这是因为数据库中存储的数据有上一级部门本身的部门名称和部门ID,其上棒瀹跏癞一级部门的部门级数会低一级,比如说上述数据的第一行为总部,虽然总部下面有子部门,但是数据库中还是要存储总部这个部门的部门名称和部门ID的,总部对应的级数为一级,那么其对应的数据记录行里面就只有FR_GEN_0层,下面的FR_GEN_1和FR_GEN_2这两层就会没有数据,显示为空白。在模板制作过程中,从第二层级开始就会有空白数据,需要将空白数据隐藏掉,选中A2和A3单元格,添加条件属性,当数据为空时隐藏该行,如下图:
8、其它设置由于自动生成的字段是编码,可以使用数据字典将其转为对应的部门名称。
9、保存与预览保存模板。点击分页预览,效果如上。
不规范组织树报表
1、问题描述在实际应用中,组织树报表除了组织树报表章节中使用到的比士嫣轶嗄较规范的组织结构,即,除了最后一层,所有其他层的结构都是子层,还有很多组织闩岳碱腠结构并不是这么的规范,有的层级结构下面没有子层,有的层级结构下面则有子层,即层级结构不确定,比如说,一个公司的公司结构,有总部,人力资源部,市场部,人力资源部下面还有人力一部,人力二部,人力一部下面才是具体员工,而市场部下面直接就是具体员工,下面用2个示例来展示这两种组织树的区别:规范的组织结构
2、不规范的组织结构
3、那么使用不规范的组织结构构建组织树报表,如果还是通过组织树报表这种方式来实现就会出现上图所示的状况,没有子层数据的层级的子层会显示空白,那么如何让没有子层数据的层级数据合并其下面所有层级单元格显示呢,如下图效果:
4、解决思路在没有子层数据的结构所在层级单元格后面向下(横向扩展向下,纵向扩展向右)合并相应个单元格(合并至最后一层),并将层级数据列拖曳进来,使该单元格扩展出相应层级的所有数据,同时添加过滤条件,如果其有子层,数据就过滤掉,显示为空白。
5、数据准备新建内置数据集ds1:,如下图:注:内置数据集中第二层级结构中有一个结构没有子层,其他的结构有子层。
6、模板制作由于上面准备数据是不规范的组织结构,我们按照组织树报表中的方法来实现组织树,即不使用树数据集,模板效果如下图:
7、单元格设置如下表:
8、注:在添加过滤条件时,需要去掉将父格子作为过滤条件前面的勾选,如下图A2单元格的过滤条件:
9、效果查看此时保存模板,可以看到如下图效果,没有子层的层级结构并没有合并单元格,其子层单元格还在,但是没有数据显示:
10、合并单元格从效果图裼沙钔炯上可以看到没有下层的层级结构应该合并单元格显示,即未归集旧数据应该合并单元格至最下层。由于FineR髫潋啜缅eport不支持自动合并单元格,只能手动合并,未归集旧数据所在层级为第二层,第二层数据所在单元格为第二行,最后一层在第三行,所以合并A2后面的单元格至第三行,即合并B2和B3单元格,A1单元格是第一层数据,故需要将其显示在所有数据上面,需要合并A1和B1单元格。回到模板设计界面,按照上述描述再操作模板,拖曳id列至B2单元格中,设置扩展为横向扩展,其父格为A2,使数据扩展时,每个第二层级数据后面都跟了一个合并的单元格,且显示对应层级数据,并设置其形态为:实际值为ds1的name字段,结果如下图:
11、此时,点击分页预览,效果如下图
12、过滤条件为刚刚合并的B2单元格添加过滤条件,B2单元格只显示没有子层的第二层结构数据,即只显示A3单元格为空的数据,添加过滤条件len(A3)==0,如下图:
13、此时,再次预览模板,如下图,有子层的层级数据后面都有一个合并的单元格,因为其对应的A3单元格不为空,故没有数据过滤过来,显示为空:
14、条件属性上面效果图中,没有子层的层级数据的子层显示为空白,有子层结构的层级数据后面的合并单元格显示为空白,通过条件属性,将空白列隐藏,如下图,同时选中AA3和B2单元格,为其添加条件属性:
15、其他设置按照效果图中设置单元格样式,并将untils数据列拖曳至第4行单元格中,如下图:
16、如果组织结构有4层,那么其模板样式如下图:
17、效果查看保存模板,点击分页预览,效果下图。