1. 描述编辑
如下图所示:当点击华东的销售时,华东的销量排序,华北的销量不受到影响。当点击华北的销量时,华北的销量排序,华东的不受到影响。
2. 思路编辑
1)定义一个数组,用数组里的元素存储对应分组的升降序(正数为升,负数为降)
2)当点击销量时,修改数组对应下标的值
3)根据数组各个下标的值对各分组进行排序
3. 操作步骤编辑
1)创建数据集ds1,sql:SELECT * FROM 销量 where 产品='苹果汁' order by 地区,销量
2)报表界面设计如下:
3)右键D2单元格,添加超级链接-动态参数,参数名字为:a,值为:ADD2ARRAY(REMOVEARRAY(IF(LEN($a) = 0, RANGE(COUNT(A1[!0;!0])), SPLIT($a, ",")), &A1, 1), IF(INDEXOFARRAY(SPLIT($a, ","), &A1) = -1, 1, -1), &A1)
公式解析:
第一步,定义数组: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,达到变换顺序的目的。
4)选中A3单元格,设置扩展后排序,排序公式为:D3 * INDEXOFARRAY(split($a, ","), &A1)
4. 效果预览编辑
1)APP
2)h5
5. 已完成模板编辑
保存模板,选择预览,即可看到上图效果。
已完成模板可参考%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Advanced\Cacuate_Between_Cells\分组内排序互不干扰.cpt。