问题描述FineReport,在组织树报表中,组织树报表是通过id和parentid来实现的。如果层级很多,为每个单元格设置过滤条件和表格会很麻烦,所以FineReport提供了一个专门的数据集——树型数据集,通过简单的设置就可以自动递归出层级,方便的实现组织树型??报表如下图所示:图1图2FineReport构造树2.1新建报表,添加数据集新建工作簿,添加数据集ds1检索原始数据,SQL语句为SELECT*FROMcompany部门。2.2定义树数据集1)根据parent字段建树用例:原表结构符合ID和parentID结构,我们可以通过parentID字段生成树,添加树数据集,如图下图中:2)根据数据长度建树使用场景:原表结构中所有ID在一列,没有父ID字段,但ID有规律,每组有同样的长度,子的前N位为父的编号,添加一个树数据集,如下图:2.3预览数据预览树数据集,可以看到递归树数据已经自动生成,FR_GEN_0为最高层,依次往下,如下:例1垂直组织树将相应的数据列拖入单元格中,设置单元格A2的左父单元格为A1,单元格A3的左父单元格toA2:3.1条件属性有上面的预览数据。可以看到从第二层FR_GEN_1开始,会有空白数据。这是因为数据库中存储的数据本身就有上级部门的部门名称和部门ID,上级部门的部门级别会低一级。department,但数据库中还需要存储总部部门的部门名称和部门ID。headquarter对应的level是level1,所以对应的数据记录行只有FR_GEN_0层,后面两层FR_GEN_1和FR_GEN_2是不会有数据的,显示为空白。在模板制作过程中,会出现二级的空白数据,需要隐藏空白数据。选中A2和A3单元格,添加条件属性,数据为空时隐藏该行,如下图:注:如果组织结构的层级结构不确定,即某些层级有子层级时有的层级没有子层级,组织树报表的实现方法请参考非标准组织树报表3.2其他设置由于自动生成的字段是编码的,可以使用数据字典转换为对应部门名称,如下图:3.3保存预览保存模板,点击分页预览效果,如图1FineReport实例2横向组织树将对应的数据栏拖入单元中,如图下图在单元格中,在右侧单元格属性表-扩展属性中将单元格B1和C1的展开方向设置为水平,将B1单元格的左父单元格设置为A1,将C1单元格的左父单元格设置为B1:4.1条件属性有以上预览数据。可以看到从二级FR_GEN_1开始会有空白数据。这是因为数据库中存储的数据本身就有上级部门的部门名称和部门ID,上级部门的部门级别会低一级。比如上面数据的第一列是总部。虽然总部下有子部门,但是数据库还是需要存储总部所在部门的部门名称和部门ID。总部相应级别为一级。level,则对应的数据记录栏中只有FR_GEN_0层,后面的FR_GEN_1和FR_GEN_2两层将没有数据,显示为空白。在模板制作过程中,会出现二级的空白数据,需要隐藏空白数据。选中B1和C1单元格,添加条件属性,数据为空时隐藏该列,如下图:4.2其他设置由于自动生成的字段是代码,可以使用数据字典将其转换为对应部门名称,如下图:4.3保存预览保存模板,点击分页预览,效果如图2。5.FineReport实例3创建树数据集的存储过程5.1问题描述存储过程直接生成树数据集是无效的,如图:5.2解决思路先创建一个数据库查询数据集ds1,然后“调用数据集ds1中的存储过程名称存储过程参数”,再用ds1生成树数据集。如果调用数据库存储过程取数据,官方只支持查询语句select取数据,其他写法(比如下面的写法),返回结果无法保证,不推荐使用:具体操作步骤如下:创建数据库查询,输入:{callusername.package.procedure('${p1}','${p2}','${p3}',?)},然后设置下一个参数的初始值,从而生成一个普通的数据集ds1,如图:然后通过数据集ds1设置树数据集。此时就可以正常生成树状数据集了,如图:其余操作同本文所述,只是组织树状报表是通过存储过程实现的,需要添加调用存储过程的步骤。本文为CSDN首创:http://blog.csdn.net/szd_happ...
