分组内排序互不干扰

  • 文档创建者:axing
  • 编辑次数:4次
  • 最近更新:Leo.Tsai 于 2019-11-07
  • 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

    附件列表


    主题: 报表应用
    • 有帮助
    • 没帮助
    • 只是浏览
    • 评价文档,奖励 1 ~ 100 随机 F 豆!