反馈已提交

网络繁忙

多列动态排序

  • 文档创建者:lu123
  • 编辑次数:24次
  • 最近更新:Alicehyy 于 2021-08-09
  • 1. 概述

    1.1 预期效果

    设计报表时,希望有多个列可以实现点击变换升序降序的功能。即点击第一列,则根据第一列升序或降序排列;点击第二列,则根据第二列升序或降序排列。预期效果如下图所示:

    1610957591887966.gif

    1.2 实现思路

    通过添加「动态参数」类型的超级链接和在单元格扩展后排序中添加公式来实现,即点击数据列标题时,将该数据列所在单元格作为参数传递过去,在扩展后排序公式中接收该参数,根据参数的不同,实现不同的排序。

    注1:当有字符串类型字段需要一起排序时,扩展后排序的公式会有所不同。文档用两个示例分别进行讲解。

    注2:同样适用于决策报表。

    注3:当数据过多分页时,或者在决策报表 Tab 块中多 Tab 页使用动态排序时,因为动态参数会刷新整个页面,在其他页点击排序会刷新跳转回第一个页面。

    2. 示例一

    2.1 数据准备

    新建数据集 ds1 ,添加 SQL 查询语句:SELECT EMPID,EMPNAME,BIRTHDATE,HEIGHT FROM EMPLOYEE limit 10

    222

    2.2 报表设计

    将 EMPID EMPNAME BIRTHDATE HEIGHT 字段分别拖到 A3~D3 单元格,输入对应标题,表格样式如下图所示:

    222

    2.3 添加超级链接动态参数

    分别选中 A2、C2、D2 单元格,选择右侧「超级链接」,添加「动态参数」,各单元格参数设置如下表:

    注:本示例方法中,字符串类型的数据无法实现排序。

    单元格
    参数值类型说明
    A2a公式if(a==-1,1,-1)

    参数 a 表示点击一次超级链接就替换一次 a 的值,1 代表升序,-1 代表降序

    参数 asc 表示要排序的单元格,日期时间类型的数据需要特殊设置

    asc字符串A3
    C2a公式if(a==1,-1,1)
    asc字符串

    tointeger(format(C3,'yyyyMMddHHmmss'))

    注:若时间类型仅包含年月日,则参数为:tointeger(replace(C3,"-",""))

    D2a公式if(a==1,-1,1)
    asc字符串D3

    步骤如下图所示:

    1610960711505808.png

    2.4 设置扩展后排序

    选中 A3 单元格,在「单元格属性>扩展属性」中选择扩展后,选中升序,输入公式if($a==1,eval($asc),eval($asc)*-1)

    公式说明如下表:

    公式
    说明

    eval(exp) 

    返回表达式 exp 计算后的结果。exp :一个表达式形式字符串

    $asc返回参数 $asc 的值
    if($a==1,eval($asc),eval($asc)*-1)如果参数 a 为 1,则根据 asc 的值升序排序,否则根据 asc 的值降序排序 

    步骤如下图所示:

    1606470304899284.png

    注:后面单元格是跟随第一列扩展的,只有在顶级的左父格设置「扩展后排序」才有效。

    2.5 效果预览

    2.5.1 PC 端

    保存报表,点击「分页预览」,效果同 1.1 节预期效果一致。

    2.5.2 移动端

    App 端和 HTML5 端均支持,效果如下图所示:

    222

    3. 示例二

    在示例一中,日期时间类型的数据需要特殊设置,字符串类型的数据无法实现排序。那么该如何实现数字、日期、字符串都能排序呢?

    以示例一模板为例,区别主要在于扩展后排序的公式,下面进行简单讲解。

    3.1 添加超级链接动态参数

    给 A2、B2、C2、D2 单元格,均添加「超级链接>动态参数」,参数设置如下表:

    单元格参数值类型说明
    A2a公式if($a=-1,1,-1)

    if($a=1,-1,1) 表示点击一次超级链接就替换一次 a 的值,1 代表升序,-1 代表降序

    参数 asc 的值为要排序的单元格

    asc字符串A3
    B2a公式if($a=1,-1,1)
    asc字符串B3
    C2a公式if($a=1,-1,1)
    asc字符串C3
    D2
    a公式if($a=1,-1,1)
    asc字符串D3

    3.2 设置扩展后排序

    选中 A3 单元格,修改扩展后排序的公式为:INARRAY(EVAL($asc),SORTARRAY(EVAL($asc+"[!0]")))*$a

    公式说明如下表:

    公式
    说明

    EVAL(exp) 

    返回表达式 exp 计算后的结果。exp :一个表达式形式字符串

    $asc+"[!0]"返回拼接后的字符,如参数 $asc 的值为 A3,则返回 A3[!0],即 A3 单元格扩展出来的所有值
    SORTARRAY(array)

    返回排过序的 array 数组

    注:当数组元素存在类型不一致或者无法比较时,返回原数组。

    INARRAY(co,array)返回 co 在数组 array 中的位置,如果 co 不在 array 中,则返回 0
    INARRAY(EVAL($asc),SORTARRAY(EVAL($asc+"[!0]")))*$a

    先用 SORTARRAY 对获取的单元格扩展的所有值进行排序,再用 INARRAY 返回当前单元格的值在排序后的所有值中的位置,再乘以参数 $a 进行升序、降序的排序。

    注:当数据列中存在空值时,小数或整数类型的数据排序可能会失效,此时可将公式修改为:INARRAY(EVAL($asc),SORTARRAY(EVAL($asc+"[!0]{len("+$asc+")>0}")))*$a 。通过 {len("+$asc+")>0} 条件过滤出不为空的数据进行排序即可。


    3.3 效果预览

    3.3.1 PC 端

    保存报表,点击「分页预览」,效果如下图所示:

    1610961145233650.gif

    3.3.2 移动端

    App 端和 H5 端均支持,效果如下图所示:

    9FAA54A8-2864-4AF5-BF3B-FB458A228A2A.GIF

    4. 模板下载

    已完成模板可参见:

    %FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\多列动态排序示例一.cpt

    %FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\多列动态排序示例二.cpt

    点击下载模板:

    多列动态排序示例一.cpt

    多列动态排序示例二.cpt

    附件列表


    主题: 报表专题
    • 有帮助
    • 没帮助
    • 只是浏览

    售前咨询电话

    400-811-8890转1

    在线技术支持

    在线QQ:800049425

    热线电话:400-811-8890转2

    总裁办24H投诉

    热线电话:173-1278-1526

    文 档反 馈

    鼠标选中内容,快速反馈问题

    鼠标选中存在疑惑的内容,即可快速反馈问题,我们将会跟进处理。

    不再提示

    10s后关闭