Java报表软件FineReport实现组织树报表

文 | 帆软数据应用研究院 2011-08-22 15:06:14

1. 问题描述
数据库中比较常见的一种表结构就是表中包含了id与parentid两个字段,其数据可以有关联(如id的前n位与parentid相同),也可以没有关系,希望根据这两个字段在web报表中实现组织树效果,如下图:
报表组织树效果图
可以看到,组织的每个层次都来自于同一列部门ID,即同一列的数据之间,存在包含与被包含关系。
Web报表软件FineReport中如何分别获取每一层的数据呢
2. 示例
2.1 新建报表,添加数据集
新建报表工作薄,添加数据集ds1,SQL语句为SELECT * FROM [公司部门],查询出公司部门表,该表即为典型的id与parentid结构。
由数据可以看出,该组织结构包含3层,因此我们需要将这三层分别取出来。最终报表模板效果如下:
报表模板
2.2 第一层
将部门ID拖拽至报表单元格A1,默认扩展出所有部门ID,通过过滤条件筛选出第一层部门;
由数据可以看出,第一层上级ID为空,因此选中报表单元格A1,点击过滤,添加条件上级ID 等于 ‘NULL’,如下图设置:
报表过滤条件1
注:根据数据的不同过滤条件相应改变。
2.3 第二层
再次将部门ID拖拽至报表单元格A2,默认仍会扩展出所有部门ID,设置A2的父格为A1,使得该级部门ID能够跟随上级部门ID自动扩展;
设置父格后会发现,取出的第二层数据与第一层相同:由于设置了父格,A1、A2中数据列又来自于同一报表数据集,此时子格默认会将父格作为过滤条件,即会筛选出部门ID=父ID的数据,导致始终选出与上一层相同的部门。因此需要选中A2单元格,点击过滤,去掉将父格子作为过滤条件。
同时添加过滤条件上级ID 等于 ‘A1’,如下图:
报表过滤条件2
2.4 第三层
第三层的原理与第二层相同,进行同样的设置即可。若数据中组织层数不止三层,可以按照相同的方法添加。
注:子层单元格必须去掉将父格子作为过滤条件。
2.5 其他设置
模板中使用的是部门ID,若要显示为相应的部门名称,可以通过数据字典进行转换。
若某一层中有些有子层,有些没有子层,此时由于扩展会出现一些空白行,可以通过报表条件属性将空白行行高设置为0,不显示出空白行。
2.6 保存并预览
保存报表模板。设计器中点击分页预览,即可看到如上的效果。

 

免费试用FineReport

阅读次数:2,085


返回顶部