1. 概述编辑
1.1 问题描述
现有的 动态折叠树 报表只能在「数据分析」预览模式下才能生效,如果想要在其他预览模式下也能使用折叠树,该如何实现呢?效果如下图所示:
1.2 解决思路
利用「超级链接>动态参数」结合「条件属性>行高」来实现。
将要点击的分组序号存入动态参数,再判断参数中是否有该分组来实现「行高」的显示与隐藏。
2. 示例编辑
2.1 数据准备
新建数据集 ds1,数据库查询语句为:SELECT * FROM 销量。
2.2 设计报表
设计表格样式如下图所示:
单元格具体设置如下表所示:
单元格 | 数据列 | 数据设置 | 扩展方向 | 左父格 | 上父格 |
---|---|---|---|---|---|
A1 | 销售员 | 分组 | 纵向 | 默认 | 默认 |
B2 | 产品类型 | 列表 | 纵向 | A1 | 默认 |
C2 | 产品 | 分组 | 纵向 | 默认 | 默认 |
D2 | 销量 | 分组 | 纵向 | 默认 | 默认 |
2.3 设置动态参数
选中 A1 单元格,点击右侧属性面板「超级链接」,添加一个「动态参数」,参数名为 a ,参数值为「公式」,公式为:IF(LEN($a) = 0, &A1, if(inarray(&A1, split($a, ",")) > 0, joinarray(GREPARRAY(split($a, ","), item != &A1), ","), $a + "," + &A1))
公式整体说明:初始化时,将 &A1 即要点击的分组序号赋值给动态参数 a,点击某个分组时,返回该分组序号在 a 中的位置,然后将该分组序号从 a 中过滤掉,再次点击时,a 中则没有该分组序号,那么就会返回 0。根据返回的值是否为 0,在条件属性中设置行高进行展开和折叠即可。
公式分解说明如下表:
公式 | 说明 |
---|---|
LEN($a) = 0 | 初始化时,a 为空,即长度为 0,将 &A1 存入动态参数中 |
&A1 | 获取 A1 单元格扩展后每个值对应的序号 |
split($a, ",") | 返回由逗号分割 a 组成的字符串数组 |
inarray(co,array) | 返回 co 在数组 array 中的位置,如果 co 不在 array 中,则返回 0 |
GREPARRAY(array,item != &A1) | 在 array 数组中过滤掉 &A1,形成一个新数组 |
JOINARRAY(array,",") | 返回一个由逗号作为分隔符的字符串 |
$a + "," + &A1 | 动态参数 a 拼接逗号和 &A1 组成一个字符串 |
步骤如下图所示:
2.4 设置条件属性
选中 B2 单元格,点击右侧属性面板「条件属性」,添加两个条件属性,并重命名为「展开」和「折叠」。如下图所示:
「展开」属性:满足公式条件inarray(&A1, split($a, ",")) > 0时,即点击的分组序号在动态参数 a 中时,行高为 5 毫米。如下图所示:
「折叠」属性:满足公式条件inarray(&A1, split($a, ",")) = 0时,即点击的分组序号不在动态参数 a 中时,行高为 0 毫米。如下图所示:
2.5 效果预览
2.5.1 PC 端
保存报表,点击分页预览,效果如下图所示:
2.5.2 移动端
App 端和 HTML5 端均支持,效果如下图所示:
3. 一键折叠/展开功能编辑
1)在示例一的基础上,若想增加一件折叠和一键展开功能,在第一行插入一行空白行,然后在 A1 单元格输入文字:一键展开,在 B1 单元格输入文字:一键关闭,如下图所示:
2)A1 单元格设置动态参数,参数名为 a,参数值为 joinarray(range(count(A2)), ","),B1 单元格设置动态参数,参数名为 a,参数值为空即可,如下图所示:
4. 模板下载编辑
已完成模板可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\primary\DetailReport\条件属性实现折叠树.cpt
点击下载模板:条件属性实现折叠树.cpt