1. 概述
1.1 预期效果
有时用户希望在同一张报表中,可以实现分组动态排序且互不影响的效果。例如当点击华东的销量时,华东的销量改变排序,华北的销量不受到影响;当点击华北的销量时,华北的销量改变排序,华东的销量不受到影响。如下图所示:
1.2 实现思路
第一步:根据「地区」的数量定义成一个数组长度,用数组中的元素存储对应分组的升降序(正数 1 为升序,负数 -1 为降序)。
第二步:当点击销量时,先删除数组中点击位置对应的值,再将变为相反数的值插入到数组中对应的位置。
第三步:设置扩展后排序,先获取点击位置对应的数组中的值,再乘以「销量」所在分组中单元格的值,按正负数的升序改变排序。
2. 示例
2.1 数据准备
新建普通报表,新建数据库查询 ds1,写入 SQL 语句:SELECT * FROM 销量 where 产品='苹果汁' 。
2.2 报表设计
合并 A1~D1 单元格,将「地区」数据列拖入单元格 A1,A2~D2 单元格输入如下图所示标题,A3~D3 单元格拖入对应的数据列。
将 A3 单元格左父格设置为 A1。自行设置表格样式,最终效果如下图所示:
2.3 设置动态参数
选中 D2 单元格,给其添加一个「超级链接>动态参数」,参数名为 a,参数值选择「公式」类型,输入公式:JOINARRAY(ADD2ARRAY(REMOVEARRAY(IF(LEN($a) = 0, RANGE(COUNT(A1[!0]))*0, SPLIT($a, ",")), &A1, 1), IF(INDEXOFARRAY(SPLIT($a, ","), &A1) = 1, -1, 1), &A1),",")
动态参数的作用是点击「销量」时,能按照公式定义的规则返回参数,再根据参数进行排序。
公式说明如下:
1)步骤一:IF(LEN($a) = 0, RANGE(COUNT(A1[!0]))*0, SPLIT($a, ","))
公式 | 说明 |
---|---|
LEN($a) = 0 | 初始化报表时,参数 a 为空,即长度等于 0,第一次点击后即被赋值 |
RANGE(COUNT(A1[!0]))*0 | 合计 A1 单元格扩展的值,定义一个长度与值同等的数组,乘以 0 是为了避免第一次点击排序时参数值均发生变化 |
SPLIT($a, ",") | 参数在传递过程中会被自动处理成字符串,所以这里还要使用 SPLIT 将参数 a 用逗号分割成字符串数组 |
2)步骤二:REMOVEARRAY(步骤一结果, &A1, 1)
公式 | 说明 |
---|---|
REMOVEARRAY(步骤一结果, &A1, 1) | 使用 &A1 获取点击的分组的位置,然后在步骤一返回的数组中,在该位置删除一个值,并返回删除后的数组。即删除了数组中点击位置对应的值 |
3)步骤三:ADD2ARRAY(步骤二结果, IF(INDEXOFARRAY(SPLIT($a, ","), &A1) = 1, -1, 1), &A1)
公式 | 说明 |
---|---|
INDEXOFARRAY(SPLIT($a, ","), &A1) | 使用 &A1 获取点击的分组的位置,返回用逗号分割的字符串数组中的这个位置的值 |
IF() | 使用 IF 来判断数组的值,用 1 和 -1 达到变换顺序的目的。即每次点击都将原值变为相反值 |
ADD2ARRAY() | 使用 &A1 获取点击的分组的位置,在步骤二返回的数组中的该位置,插入变为相反值数组中的所有元素,再返回该数组 |
4)步骤四:JOINARRAY(步骤三结果,",")
公式 | 说明 |
---|---|
JOINARRAY(步骤三结果,",") | 动态参数不能返回数组类型的数组,所以需要使用数组函数将步骤三结果转化成一个由逗号作为分隔符的字符串 |
步骤如下图所示:
2.4 设置扩展后排序
选中 A3 单元格,设置「扩展后排序」,选中「升序」,输入公式为:D3 * INDEXOFARRAY(split($a, ","), &A1)。
INDEXOFARRAY(split($a, ","), &A1) 表示使用 &A1 获取点击的分组的位置,返回用逗号分割的字符串数组中的这个位置的值,即为 1 或 -1。
再用 D3 单元格的值乘以 1 或 -1,按正数升序时,销量列即为「升序」,按负数升序时,销量列即为「降序」。
步骤如下图所示:
2.5 效果预览
2.5.1 PC 端
保存报表,点击「分页预览」,效果与 1.1 节预期效果一致。
2.5.2 移动端
App 端和 HTML5 端均支持,效果如下图所示:
3. 模板下载
已完成模板可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\分组内排序互不干扰.cpt
点击下载模板:分组内排序互不干扰.cpt