历史版本3 :排序常见问题 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 概述编辑

本文将介绍各类排序使用过程中遇到的问题和解决方案。

2. 排序报错编辑

问题描述

部分报表在使用排序功能时,偶尔会抛出异常:Comparison method violates its general contract,如下图所示:

1585300804370699.jpg

原因分析

在 JDK6 中运行正常,而在 JDK7 中却会抛异常,因为 JDK7 及之后版本底层的排序算法从 MergeSort 换成了 TimSort。

解决方案

如果要继续使用 JDK6 的排序算法,可以打开%FR_HOME%\ bin\designer.vmoptions 在JVM 启动参数中加入参数:

-Djava.util.Arrays.useLegacyMergeSort=true 

如下图所示:

Snag_1e1fa1db.png

配置后,就会依旧使用 JDK6 的排序算法,解决这个兼容的问题。

3. 排序时数值型字段存在空值时报错编辑

问题描述

若对「数值型字段」设置了排序,而字段中存在空值,那么在预览或点击标题排序时就会出现报错。

例如在「订单 ID」列设置了点击标题改变排序,其扩展后排序公式为:if($a=1,$$$,-$$$),表示根据当前列的值进行排序。如下图所示:

1615947689973944.png

此时预览报表,点击「订单 ID」标题,出现报错如下图所示:

解决方案

在排序公式中对空值赋值后参与排序。

将公式写为:if($a=1,if(len($$$)=0,min(ds1.select(订单ID))-1,$$$),if(len($$$)=0,-(min(ds1.select(订单ID))-1),-$$$)) 。即当字段为空时,给其赋值为(订单 ID最小值-1),参与排序。

公式说明如下表:

公式
说明
len($$$)=0当前单元格值为空
min(ds1.select(订单ID))-1获取数据集 ds1 中「订单ID」(排序字段)的(最小值-1)
-(min(ds1.select(订单ID))-1) 获取数据集 ds1 中「订单ID」(排序字段)的 -(最小值-1)

注:数据集函数使用方法参考数据集函数

修改公式后,点击预览报表,效果如下图所示:

6144D72B2201C26674D05D4A22A55695.gif

模板下载

已完成模板可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\数值型字段排序有空值.cpt

点击下载模板:数值型字段排序有空值.cpt