反馈已提交

网络繁忙

树数据集实现组织树报表

  • 文档创建者:文档助手1
  • 编辑次数:28次
  • 最近更新:Catqiu 于 2022-07-26
  • 1. 概述

    组织树报表 中由 ID 与父 ID 来实现组织树报表,若层级数较多时,对每个单元格设置过滤条件和形态会比较繁琐,因此 FineReport 提供了一种特殊的数据集——树数据集,只需要简单的设置就能自动递归出层级,方便的实现如下图组织树报表:

    图一:纵向组织树


    图二:横向组织树


    2. 构建树数据集

    一般分两步构建树数据集:

    1)添加带有层次关系的普通数据集;

    2)基于普通数据集构建树数据集。

    2.1 添加普通数据集

    添加数据集 ds1 取出原始数据,SQL 语句为:SELECT * FROM 公司部门

    2.2 构建树数据集

    2.2.1 根据父字段构建树

    使用情形:原始表结构中符合 ID、parentID 结构,我们可以通过父 ID 这个字段生成树,添加树数据集,如下图。

    需要特别强调的是,此种情况,需要有唯一根节点(就是下图 parentID 为空的节点)。如果没有,那么构建树时会无法正常建立索引,最后在前台使用下拉树控件时容易出现一些功能问题,比如控件不能给默认值、比如不能模糊搜索等。


    2.2.2 根据数据长度构建树

    使用情形:原始表结构中所有ID都在一列中,且没有父 ID 字段,但是 ID 是有规律的,每组的长度相同,且子级的前N位就是父级编号,添加树数据集,如下图:

    2.3 树数据集预览

    预览树数据集,可看到已自动生成递归树数据,FR_GEN_0为最高层,依次往下,如下:

    3. 示例一:纵向组织树

    3.1 模板设计

    按照下图所示将对应的数据列拖入到单元格中,默认单元格纵向扩展并设置左父格:A2 单元格的左父格设置为 A1,A3 单元格的左父格设置为 A2,如下图所示:

    3.2 条件属性隐藏空白行

    有上面预览数据可以看到从二层 FR_GEN_1 开始,就会有空白数据,这是因为数据库中存储的数据有上一级部门本身的部门名称和部门 ID,其上一级部门的部门级数会低一级,比如说上述数据的第一行为总部,虽然总部下面有子部门,但是数据库中还是要存储总部这个部门的部门名称和部门ID的,总部对应的级数为一级,那么其对应的数据记录行里面就只有FR_GEN_0 层,下面的 FR_GEN_1FR_GEN_2 这两层就会没有数据,显示为空白。

    在模板制作过程中,从第二层级开始就会有空白数据,需要将空白数据隐藏掉,选中 A2 和 A3 单元格,添加条件属性,当数据为空时隐藏该行,如下图:

    注:如果组织结构的层级结构不确定,即有的层级有子层,有的层级没有子层时,其组织树报表的实现方式请查看:不规范组织树报表

    3.3 其他设置

    由于自动生成的字段是编码,可以使用数据字典将其转为对应的部门名称,如下图:


    3.4 效果预览

    3.4.1 PC 端

    如概述中图一所示。

    3.4.2 移动端

    App 与 HTML5 端效果相同,如下图所示:

    3.5 模板下载

    已完成的模板可参见:%FR_HOME%\webroot\WEB-INF\reportlets\doc\Advanced\GroupReport\树数据集组织树报表.cpt

    点击下载模板:树数据集组织树报表.cpt

    4. 示例二:横向组织树

    4.1 模板设计

    按照下图所示将对应的数据列拖入到单元格中,设置单元格横向扩展并设置父格:B1 单元格的左父格设置为 A1,C1 单元格的左父格设置为 B1,如下图所示:

    4.2 条件属性隐藏空白列

    有上面预览数据可以看到从二层 FR_GEN_1 开始,就会有空白数据,这是因为数据库中存储的数据有上一级部门本身的部门名称和部门 ID,其上一级部门的部门级数会低一级,比如说上述数据的第一列为总部,虽然总部下面有子部门,但是数据库中还是要存储总部这个部门的部门名称和部门ID的,总部对应的级数为一级,那么其对应的数据记录列里面就只有FR_GEN_0 层,下面的 FR_GEN_1FR_GEN_2 这两层就会没有数据,显示为空白。

    在模板制作过程中,从第二层级开始就会有空白数据,需要将空白数据隐藏掉,选中 B1 和 C1 单元格,添加条件属性,当数据为空时隐藏该列,如下图:

    注意因为是横向的,所以应该是列宽而不是行高!

    4.3 其他设置

    由于自动生成的字段是编码,可以使用数据字典将其转为对应的部门名称,如下图:

    4.4 效果预览

    4.4.1 PC端

    如概述中图二所示。

    4.4.2 移动端

    App 与 HTML5 端效果相同,如下图所示:

    5. 示例三:存储过程创建树数据集

    5.1 新建数据集

    建立数据库查询数据集 ds1,然后数据集 ds1 里 “call 存储过程名 存储过程参数”,再用 ds1 生成树数据集 。

    注:若是调用数据库存储过程取数,官方只支持查询语句 select 进行取数,其他写法(例如下面的写法), 返回的结果不能保证,不建议使用 。

    具体操作步骤如下:

    新建一个数据库查询,输入:{call username.package.procedure('${p1}','${p2}','${p3}',?)},然后设置下参数的初值,这样就产生了一个普通的数据集 ds1。再通过数据集 ds1,设置树数据集就好了,此时就可以正常生成树数据集了,如图:

    5.2 注意事项

    存储过程直接生成树数据集无效,如图:

    6. 未知层级的情况

    评论中很多人问到了层级未知的情况。我们不妨用递归的思路来梳理一下什么是组织树:数据之间是有明显父子关系的。

    从某个层级开始假如我们向上递归查找,总能找到有限的父层级,这时候不存在层级未定,我们以最大的父层级作为层级数。

    假如我们向下递归查找,实际情况当中子层级也是有限的,假如出现子层级不断增长的情况,无论增长到多少级,最终也能找到最深的那个子层级。


    附件列表


    主题: 报表应用
    • 有帮助
    • 没帮助
    • 只是浏览

    售前咨询电话

    400-811-8890转1

    在线技术支持

    请前往「服务平台」,选择「在线支持」

    热线电话:400-811-8890转2

    总裁办24H投诉

    热线电话:173-1278-1526

    文 档反 馈

    鼠标选中内容,快速反馈问题

    鼠标选中存在疑惑的内容,即可快速反馈问题,我们将会跟进处理。

    不再提示

    10s后关闭