帆软报表之 排序(总结) 二
3.4 条件属性设置
原模板中使用了&来产生序号,会发现重新排序后顺序被打乱了,需要使用条件属性重新生成序号。在序号(A4单元格)中增加新值条件属性,选择公式,在公式中输入:row()-3。如下图所示:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151157941-1189055757.jpg)
3.5 总结
以上便设置好了,预览即可看到上图效果。可以看出,在数据列的高级处进行排序需要进行很复杂的公式进行还原,而用扩展后排序只需要引用对应的单元格即可。
具体的模板设置可参考:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\扩展后排序.cpt。
在线查看示例效果请点击Order_2.cpt
根据点击次数奇偶性排序之数值型
1. 描述
在进行排序的时,很多时候您可能想实现根据点击的次数进行升降序排序,也就是说点击第一次点击标题升序排序,再次点击就降序,以此类推,而不是通过选择升序进行升序排列,选择降序进行降序排列。
2. 思路
由扩展后排序可知,可以根据参数值的不同来决定升序还是降序,这里也可以此思路进行实现,定义一个参数,如果参数值为1的时候,就升序,参数值为0的时候,按照数据列的负数进行升序排序,即数据列降序。
注:该方法只适用于排序数据列数据类型为数字型的字段,如果数据类型为字符型,请查看根据点击次数奇偶性排序之字符型。
下面以两个简单示例进行介绍:示例一,模板根据订单ID进行升序降序排列,第一次点击订单ID的时候升序,再次点击时降序;示例二,同理,模板根据货运费进行升序降序排列,第一次点击货运费的时候升序。
注:不管是按照什么字段进行排序,必须要把排序公式写在其父格的单元格设置里。
3. 示例一
3.1 打开模板
打开模板:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Primary\DetailReport\Details.cpt。
3.2 超级链接设置
选中A1单元格,右键选择超级链接,添加一个动态参数,增加一个动态参数a,参数值为公式if($a = 1, 0, 1),如下图:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151157228-414577501.jpg)
注:公式的含义是,如果参数a的值为1的时候,点击该超级链接,则将a的值变为0,如果a的值不为1的时候,点击该超级链接,将a的值变为1。
3.3 排序设置
1)方法一:高级排序
双击A2单元格,选择高级,在排序顺序处选择升序,公式值为if($a==1,$$$,-$$$),如下图:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151200565-1099223474.jpg)
注:公式的意义是,如果动态参数值为1,那么就将订单ID按照订单ID升序排序,如果不为1,就按照订单ID的负数进行升序排序,即按照订单ID进行降序排序,由于只有数值型数据才有负数,字符型数据没有负数,故该方法只适用于数值型字段排序。
2)方法二:扩展后排序
选中A2单元格,右击单元格>扩展属性中的扩展后选择升序,值为公式=if($a==1,A2,-A2),如下图:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151200563-888279452.jpg)
注:公式意义同上,此处是根据单元格进行排序,所以公式中输入的是单元格,不是数据列名字。
3.4 效果查看
不论是根据高级排序设置,还是扩展后排序设置,设置的效果如下:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151158771-739763990.jpg)
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151200646-1726579728.jpg)
已完成模板请参照%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\Order_4.cpt
在线查看示例效果请点击Order_4.cpt
4. 示例二
4.1 打开模板
打开模板:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Primary\DetailReport\Details.cpt。
4.2 超级链接设置
按照运货费进行排序:选中F1单元格,右键选择超级链接,添加一个动态参数,增加一个动态参数a,参数值为公式if($a = 1, 0, 1),如下图:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151157228-414577501.jpg)
注:公式的含义是,如果参数a的值为1的时候,点击该超级链接,则将a的值变为0,如果a的值不为1的时候,点击该超级链接,将a的值变为1。
4.3 排序设置
1)方法一:高级排序
双击A2单元格,选择高级,在排序顺序处选择升序,公式值为if($a==1,$运货费,-$运货费),如下图:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151157890-1317305979.jpg)
另:由于此处排序是设置数据列的排序,则公式中输入的是数据列的名称。
警告:这里要注意,不管是按照什么字段进行排序,必须要把排序公式写在其父格的单元格设置里。如:要按照货运费进行排序,该字段的父格是订单ID,则需要双击订单ID来进行高级->排列顺序的设置 ,这样才会实现效果,若在各自的单元格上设置是不能实现效果的。
2)方法二:扩展后排序
选中A2单元格,右击单元格>扩展属性中的扩展后选择升序,值为公式=if($a==1,F2,-F2),如下图:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151200646-1062329670.jpg)
4.4 效果查看
不论是根据高级排序设置,还是扩展后排序设置,设置的效果如下:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151200556-1804258209.jpg)
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151158404-115066720.jpg)
根据点击次数奇偶性排序之字符型
1. 描述
在进行排序的时,很多时候您可能想实现根据点击的次数进行升降序排序,而不是通过选择升序进行升序排列,选择降序进行降序排列,如果是数值型字段,可根据根据点击次数奇偶性排序之数值型中的方法实现,那么如果是字符型字段呢,又该如何实现?
2. 思路
通过超级链接实现升序降序两张模板之间的相互调用,每点击一次就切换到另一张模板。
下面以一个简单示例进行介绍。
也可以在一张模板里实现,具体参考字符型数据动态排序
3. 示例
3.1 打开模板
打开模板:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Primary\DetailReport\Details.cpt。
3.2 修改数据集
升序模板
将原来的数据集修改为:SELECT * FROM 订单 order by 客户ID,根据字符型字段客户ID对数据进行升序排序,另存为Order_A.cpt:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\字符型数据升序排序.cpt。
降序模板
将原来的数据集修改为:SELECT * FROM 订单 order by 客户ID desc,根据客户ID对数据进行降序排序,另存为Order_B.cpt:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\字符型数据降序排序.cpt。
3.3 超级链接设置
右击客户ID表头所在单元格B1,选择超级链接,点击网络报表,在网络报表的路径处选择模板,字符型数据升序排序.cpt和字符型数据降序排序.cpt的设置分别如下:
字符型数据升序排序.cpt:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151158926-653169725.jpg)
注:链接打开于处选择当前窗口
字符型数据降序排序.cpt:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151159937-2071900148.jpg)
注:链接打开于处选择当前窗口
3.4 效果查看
打开字符型数据升序排序.cpt,点击分页预览,看到的是按照客户ID的升序排序,直接点击客户ID,则会按照客户ID进行降序排序,再次点击客户ID,则会又按照客户ID进行升序排序。
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151200726-1303755032.jpg)
已完成模板,可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\字符型数据升序排序.cpt和
%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\字符型数据降序排序.cpt。
在线查看示例效果请点击Order_A.cpt
多列排序
1. 描述
在上一节中介绍了点击数据列标题实现升序降序排序,那么,如果有多个列想实现这样的升序降序功能呢。
即点击订单ID是根据订单ID升序排序,再点击订单ID则根据订单ID降序排序,接着点击运货费则根据运货费升序排序,以此类推。
2. 思路
由上一节的扩展后排序来实现,即点击数据列标题时,将该数据列所在单元格作为参数传递过去,在扩展后排序公式中接收该参数,根据参数的不同,实现不同的排序,下面详细介绍。
3. 示例
3.1 数据准备
添加数据库查询,SQL语句为:SELECT EMPID,EMPNAME,BIRTHDATE,HEIGHT FROM EMPLOYEE limit 10,如下图所示:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151200691-91469309.jpg)
3.2 报表设计
报表设计如下,将EMPID,EMPNAME,BIRTHDATE,HEIGHT字段分别拖到A3,B3,C3,D3单元格,如下图:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151158309-1903048427.jpg)
3.3 超级链接参数设置
1)选中A2单元格,右键,选择超级链接,添加一个动态参数,增加2个参数,如下图:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151157486-1731077751.jpg)
参数a的意义在于,点击一次超级链接就替换一次a的值,那么在下面进行排序就可以根据a的值来决定是升序还是降序。
参数asc是要排序的单元格,注意:它的值类型是字符串
2)选中D2单元格,进行相同操作,如下图:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151158307-1658285815.jpg)
3)选中C2单元格,因为C3是时间类型的原因,因此动态参数设置如下:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151158399-1236853913.jpg)
其中asc参数为:tointeger(format(C3,'yyyyMMddHHmmss'))
若是时间类型仅包含年月日,则参数为:tointeger(replace(C3,"-",""))
注:此处虽然填的是公式,但参数类型仍是字符串
第二列是字符串类型,无法动态排序
3.4 扩展后排序
选中A3单元格,在单元格属性>扩展属性中选择扩展后,选中升序,输入公式if($a==1,eval($asc),eval($asc)*-1),如下图:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151158838-1809233564.jpg)
3.5 效果查看
点击分页预览,效果如下:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151159968-1577031961.jpg)
已完成模板,详情可参照:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Primary\GroupReport\多列排序.cpt
4. 移动端效果
app效果:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151200645-501767868.jpg)
h5效果:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151200645-501767868.jpg)
横向扩展列多列排序
1. 描述
当模版要实现多列点击排序,而多列的列名是根据字段横向扩展出来的,使用扩展后排序中的方法分别设置order参数的值无法实现横向扩展列中的点击列排序。
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151200374-1884181692.jpg)
2. 实现方法
获取点击列的所有值,然后在销售员的单元格属性中,设置扩展后排序,销售员根据点击列的所有值进行排序。
3. 示例
3.1 绑定数据列
将数据列拖拽至单元格,并设置单元格的属性,设置位置及方法如下图:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151200647-1994644284.jpg)
按照上图方法,将下表中对应数据列拖入到单元格中(扩展设置在右下面板的【扩展方向】,数据设置在右上面板【数据设置】):
注:字段设置为汇总时扩展属性会自动变为不扩展,可以通过单元格左上角的灰色箭头查看单元格的扩展方向。
单元格
|
数据集
|
数据列
|
属性
|
A2
|
ds1
|
销售员
|
从上到下扩展,居中,其余默认
|
B1
|
ds1
|
产品
|
从左到右扩展,居中,其余默认
|
B2
|
ds1
|
销量
|
不扩展,数据设置:汇总|求和,居中,其余默认
|
3.2 超级链接设置
给B1单元格,添加超级链接-动态参数,新增1个动态参数为“排序”,并添加两个参数名order和index,order的参数值为公式:if($order == 1, 0, 1),index的参数值为公式:&B1,如下图所示:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151157807-1703318940.jpg)
注:超级链接-动态参数中的index为&B1,即点击时设置index的值为所点击的单元格的序号。
3.3 排序方法的设置
右击销售员所在列(A2单元格),右击单元格>扩展属性,在设计器右侧下方的单元格属性面板中设置扩展后排序为升序并且公式为:if($order == 1, EVAL("B2[;B1:" + $index + "]"), EVAL("-B2[;B1:" + $index + "]")) 。如下图所示:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151159908-1655136932.jpg)
注:该公式的含义为:order为1时,按照EVAL("B2[;B1:" + $index + "]")获取到的点击列的值进行升序排列;order为0时,将获取到的点击列的值处理为负数,然后按照负数进行升序排列。
具体的模板设置可参考:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\横向扩展列多列排序.cpt。
在线查看示例效果请点击Order_6.cpt
非纯数字扩展列乱序排列的解决方案
1. 描述
报表的展示效果直接关乎到用户的体验和使用!比如一张月报表,如果是按照1月-12月的顺序展示出来,用户查阅便一目了然,但有时候却事与愿违。遇到这种非纯数字的扩展表头时,使用原值排序就会导致错乱。此时,我们可以使用公式排序, 如图所示:
原值排序:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151200649-2080079969.jpg)
公式排序:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151200556-1959607154.jpg)
2. 实现思路
我们可以通过有关公式(函数)对表头进行处理后再排序!
例如:INT(REPLACE($$$,'',''))或 SWITCH($$$,'','')
3. 解决方案
新建数据集ds1: SQL为SELECT * FROM sale_month where type ='实际'
选中B1单元格,选择单元格属性表-扩展属性,扩展方向为横向,扩展后选择升序并输入公式,有两个公式可选:
![0](https://img2020.cnblogs.com/blog/1446192/202201/1446192-20220105151200563-1877825150.jpg)
公式①:INT(REPLACE($$$,'月','')) ,将单元格内容中的'月'替换成'',再将其转换成整型。比如:10月变成10
公式②:SWITCH($$$,'1月',1,'2月',2,'3月',3,'4月',4,'5月',5,'6月',6,'7月',7,'8月',8,'9月',9,'10月',10,'11月',11,'12月',12)
SWITCH()函数的用法,这里就不详述了,请参考Switch函数
设置完成后,单元格的字符串值就被转换成了整型数据,再排序的话就会按照设置的从大到小(从小到大)有序排列了!
保存模板,预览效果如上。
拥有自信,努力奋斗,保持乐观积极地情绪,逆着阳光,成功就在前方。自己选择的路,放弃者绝不会成功,成功者绝不放弃。