1. 概述
1.1 问题描述
在制作报表时,经常遇到需要通过点击标题实现升序和降序交换显示。文档 数据集中的排序 中,可通过定义数据集参数,利用动态参数实现点击标题动态排序。
但有些情况下无法用到数据集排序,例如制作报表时有一列是通过其他数据列计算得出的,如下图中「利润」是由(单价-进价)*数量得来的,那么这时要如何实现直接点击标题动态排序呢?
1.2 解决思路
来实现,即点击数据列标题时,将该数据列所在单元格作为参数传递过去,在扩展后排序公式中接收该参数,根据参数的不同,实现不同的排序。
注1:数值型和字符型的设置有所不同,详情在示例中查看。
注2:本文讲解仅一列数据变换排序,多列动态排序请参考文档 多列动态排序。
2. 示例:数值型
2.1 数据准备
新建普通报表,新建数据库查询 ds1,SQL 查询语句为:SELECT * FROM 订单明细 limit 20。如下图所示:
2.2 设计报表
将数据集中的数据拖入表格,设置 A2 单元格的「数据设置」为「列表」,F2 单元格中插入公式:(C2 - E2) * D2,设计报表样式如下图所示:
2.3 添加动态参数
选中「利润」标题所在 F1 单元格,添加一个「超级链接>动态参数」 a,参数值为公式:if($a=1,-1,1),如下图所示:
2.4 设置扩展后排序
在「最父格」A2 单元格设置,选中 A2 单元格,选择「单元格属性>扩展」,设置「扩展后排序」为升序,输入公式:if($a=1,F2,-F2),F2 表示按照 F2 单元格的值进行排序。如下图所示:
注:数值型字段排序时若字段为空,需要在排序公式中给空值赋值。详情可参见 排序时数值型字段存在空值时报错。
注:由于只有数值型数据才有负数,字符型数据没有负数,故这种排序方法只适用于「数值型字段」排序。
2.5 效果预览
2.5.1 PC 端
保存报表,点击「分页预览」,效果与 1.1 节效果图一致。
2.5.2 移动端
App 端和 HTML5 端均支持,效果如下图所示:
3. 示例:字符型
3.1 数据准备
新建普通报表,新建数据库查询 ds1,SQL 查询语句为:SELECT * FROM 销量 where 地区='华北'。如下图所示:
3.2 设计报表
将数据集中的数据拖入表格,设置 A2 单元格的「数据设置」为「列表」,报表样式如下图所示:
3.3 添加动态参数
选中「销售员」标题所在 B1 单元格,添加一个「超级链接>动态参数」 参数设置如下表:
参数名 | 参数值类型 | 参数值 |
---|---|---|
a | 公式 | if(a=1,-1,1) |
asc | 字符串 | B2 |
步骤如下图所示:
3.4 设置扩展后排序
选中 A2 单元格,选择「单元格属性>扩展」,设置「扩展后排序」为升序,输入公式:INARRAY(EVAL($asc),SORTARRAY(EVAL($asc+"[!0]")))*$a。
公式说明如下表:
公式 | 说明 |
---|---|
EVAL($asc) | 返回表达式 $asc ,即 B2 单元格计算后的结果。 |
$asc+"[!0]" | 返回拼接后的字符,即返回 B2[!0],即 B2 单元格扩展出来的所有值 |
SORTARRAY(array) | 返回排过序的 array 数组 注:当数组元素存在类型不一致或者无法比较时,返回原数组。 |
INARRAY(co,array) | 返回 co 在数组 array 中的位置,如果 co 不在 array 中,则返回 0 |
步骤如下图所示:
3.5 效果预览
3.5.1 PC 端
保存报表,点击「分页预览」,效果如下图所示:
3.5.2 移动端
App 端和 HTML5 端均支持,效果如下图所示:
4. 模板下载
已完成模板可参见:
%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\点击标题改变排序-数值型.cpt
%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\点击标题改变排序-字符型.cpt
点击下载模板: