多列头点击排序
教学视频
目标
要实现的效果如下图所示:
在上图当中,三列数据点击列头标题都可以对当前列进行排序。
同样,要实现上面的效果也有两种方法,第一种方法就是在数据集中通过表达式来生成SQL实现排序;第二种方法就是在报表中利用单元格的排序属性实现。
方法一:在数据集中通过表达式生成SQL实现排序
1.定义报表参数
首先在报表中定义两个参数,如下图所示:
名为fieldName的参数默认值为空;order参数的默认值为asc。
2.定义数据集
创建一个用于加载employee表数据的数据集,如下图:
在这个数据集的SQL部分,我们使用的是表达式,在BaskReport当中如果需要在SQL数据集中使用表达式来生成具体SQL,可以将表达式放在${}当中,上图中的表达式内容为:
var sql="select * from employee";
if($fieldName){
sql=sql+" order by "+$fieldName+" "+$order;
}
return sql;
上面的表达式脚本当中,我们首先通过var定义了一个名为sql的变量,值为从employee表中查询所有数据的标准SQL,接下来判断名为fieldName的报表参数值是否为空,在BaskReport的脚本当中,借鉴了Javascripty语法,在条件判断时,如果某个变量返回值为null或空字符串,那么就返回false,否则返回true,所以上面的if语句通过这种方式判断fieldName参数的值。
如果fieldName参数值不为null或空字符串,那么就对sql变量进行组装,添加order by子句和具体的排序方式,最后通过return子句返回运算后的sql变量,将这个返回后的变量作为最终查询数据库的SQL。
3.配置链接
使用employee数据集,设计一个报表,如下图所示:
分别选中A1、B1、C1单元格,在他们右侧的属性面板的链接页签中各添加一个设置参数类型的链接。
A1单元格添加的链接如下图:
表示在点击这个链接时,将会修改fieldName参数值为表达式"employee_id",表示要按employee_id字段进行排序,同时修改order参数值为表达式$order=="asc" ? "desc" : "asc",表示如果当前order参数值为asc那么就返回desc,否则就返回asc。
B1单元格添加的链接如下图:
表示在点击这个链接时,将会修改fieldName参数值为表达式"employee_name",表示要按employee_name字段进行排序,同时修改order参数值为表达式$order=="asc" ? "desc" : "asc",表示如果当前order参数值为asc那么就返回desc,否则就返回asc。
C1单元格添加的链接如下图:
表示在点击这个链接时,将会修改fieldName参数值为表达式"salary",表示要按salary字段进行排序,同时修改order参数值为表达式$order=="asc" ? "desc" : "asc",表示如果当前order参数值为asc那么就返回desc,否则就返回asc。
保存预览,就可以看到预期效果。
方法二:用单元格的排序属性实现
1.修改数据集SQL
打开employee数据集,修改SQL为直接加载所有的employee表数据,效果如下图:
2.设置单元格排序属性
选中A2单元格,在右侧属性面板中设置其数据展开生排序属性为自定义,在排序字段中添加表达式:$fieldName ? $fieldName : "SALARY";在排序方式中定义表达式:$order=="asc" ? "desc" : "asc",如下图所示:
排序字段表达式为$fieldName ? $fieldName : "SALARY",表示如果当前参数fieldName值为空,那么就使用SALARY字段排序,否则就使用fieldName参数对应的值进行排序。
排序方式表达式$order=="asc" ? "desc" : "asc"表示如果当前参数order值为asc,那么就返回desc排序,否则就使用asc排序。
在上面的排序方式表达式中我们使用了一个三元表达式,从而将传入的排序方式取反,实际应用时可以直接用$order参数作为排序表达式,直接取order参数值进行排序即可。
3.配置链接
A1单元格上绑定的设置参数链接如下图:
B1单元格绑定的配置参数链接如下图:
C1单元格绑定的配置参数链接如下图:
可以看到A1、B1、C1单元格上配置的设置参数链接与方法一基本相同,唯一不同的地方就是对参数fieldName的值设置由原来的小写全部改成了大写,这是因为在方法一当中,查询SQL不区分大小写,但在方法二中从数据集中取出的字段是大写,通过报表排序时指定字段名必须要与数据集中生成的字段名一致,所以这里的fieldName参数值全部是大写。
保存预览,可以看到同样的预期效果。
如之前所说,方法一采用的是SQL查询层面排序,方式二是报表层面数据排序,因为方法一性能要好于方法二,实际使用时推荐使用方法一实现该排序功能。