历史版本4 :分组内排序互不干扰 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 概述编辑

1.1 应用场景

如下图所示:当点击华东的销量时,华东的销量排序,华北的销量不受到影响。当点击华北的销量时,华北的销量排序,华东的不受到影响。
222

1.2 实现思路

1)定义一个数组,用数组里的元素存储对应分组的升降序(正数为升,负数为降)。

2)当点击销量时,修改数组对应下标的值。

3)根据数组各个下标的值对各分组进行排序。

2. 示例编辑

1)新建数据集 ds1,写入 SQL 语句:SELECT * FROM 销量 where 产品='苹果汁' order by 地区,销量

Snag_88e8ec6.png

2)如下图设计报表的样式:

222

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),",")

Snag_8930eff.png

公式解析:

  • 定义数组:IF(LEN($a) = 0, RANGE(COUNT(A1[!0;!0])), SPLIT($a, ",")) 

初始化报表时,参数 a 为空,因此我们要根据分组的长度定义一个同等长度的数组 RANGE(COUNT(A1[!0;!0])),当点击过一次之后,参数 a 就被赋予了值,这时我们直接取参数 a 即可,由于参数在传递过程中被自动处理成了字符串,所以这里还要使用 split 来分割参数 a。

接下来是修改数组对应下标的值,由于没有相应的公式,这里先删除对应下标的值,然后再在对应下标添加新的值。

  • 删除相应点击位置对应数组下标的值:REMOVEARRAY(上一步结果, &A1, 1)

这里使用 &A1 获取相应点击的分组的位置,然后从上一步结果的数组中在该位置删除一个值。

  • 判断原数组对应下标的值,然后添加相反值到相应点击位置对应数组下标下:ADD2ARRAY(上一步结果, IF(INDEXOFARRAY(SPLIT($a, ","), &A1) = -1, 1, -1), &A1)

这里使用 IF 来判断,由于定义的数组一开始是 range(分组数量),所以判断条件写为等于 -1,所以每个分组点击第一次的时候必不成立,从而将本是正数的值变成 -1,达到变换顺序的目的。

  • 10.0动态参数不能返回数组类型的数组,需要使用到数组函数JOINARRAY(array,sepa)

4)选中 A3 单元格,设置扩展后排序,排序公式为:D3 * INDEXOFARRAY(split($a, ","), &A1)

Snag_89bd0e1.png

3. 效果预览编辑

1)PC端:

222

2)移动端:

222

4. 已完成模板编辑

已完成模板可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Advanced\Cacuate_Between_Cells\分组内排序互不干扰.cpt

点击下载模板:分组内排序互不干扰.cpt