动态显示前N个分组

教学视频

目标

我们要实现的效果如下图所示:

demo

在上面的例子当中,分组的个数由外部参数决定,超出分组数目的项目用其它表示。

实现

1.制作基础报表

添加一个包含employee表的数据集,报表中保留两行三列,在相应单元格中绑定employee数据集的相关字段,如下图所示:

image-20211101154550073

设置第一行为复制表头行,以使得其在每一页都可以显示。

2.设置分组表达式

选择A2单元格,在右侧的属性面板中修改其数据聚合方式为表达式分组,并添加相应表达式,如下图:

image-20211101154705928

分组表达式内容如下:

var pos=indexOf(#,employee.group(DEPT_ID))+1;
if(pos>$p1){
    return "其它";
}else{
    return #;
}

上面的表达式含义如下:

表达式 含义
indexof 标准函数,语法:indexof(targetObj,array/str),返回targetObj对象在目标数组array中的位置;或者targetObj对象是一个字符串,那么第二个参数也是一个字符串,结果就是返回targetObj在第二个参数str中的位置。注意:返回值从0开始,如果第一个参数不在第二个参数当中,返回-1。
employee.group(DEPT_ID) 根据当前单元格位置以分组方式返回数据集employee中字段DEPT_ID的所有数据,结果为多条就以集合形式返回
# 当前单元格数据
indexOf(#,employee.group(DEPT_ID)) 表示判断当前单元格对应的部门ID,在所有分组后的部门ID的位置
$p1 一个名为p1的报表参数

上面的表达式我们采用的是脚本方式书写,这样阅读起来更为直观,当前我们也可以改成下面这样的由一行表达式来实现。

(indexOf(#,employee.group(DEPT_ID))+1)>$p1 ? "其它" : #
2.定义报表参数

上面的表达式中使用了一个名为p1的报表参数,我们需要在报表中声明。点击报表工具栏上的设置按钮,在弹出窗口的第一个标签页中定义一个名为p1的参数,类型为数据,默认值为3,如下图所示:

image-20211101155728645

切换到报表的查询表单页签,将工具栏上的名为p1的参数拖到工作区中,设置其标题为分段长度:,并将工具栏上的查询按钮拖到工作区合适位置,如下图:

image-20211101150628560

保存预览报表,就可以看到一个实现了动态显示分组数量的报表。

上面的报表示例中,使用了表达式indexOf(#,employee.group(DEPT_ID)),在这个表达式中会计算employee数据集DEPT_ID字段分组后的信息,报表第一列的每条数据在计算时都会使用这个表达式,也就是说有多少条记录,employee.group(DEPT_ID)就会被调用多少次,在大数据量情况下,这次导致严重的性能问题,所以上述报表只能适用于数据量较少的场景。

results matching ""

    No results matching ""