报表设置行排序字段并赋值原创
金蝶云社区-技术支持与赋能部_ZH
技术支持与赋能部_ZH
2人赞赏了该文章 1,126次浏览 未经作者许可,禁止转载编辑于2023年10月09日 16:23:36

关键词:报表,字段排序

一、需求

报表需要根据数据源字段排序,并给排序字段赋值排序

二、思路与方案

2.1分析思路

可以使用kd.bos.report.plugin.AbstractReportFormPlugin#processRowData方法干预报表数据显示,但是如果用到排序字段,可能需要遍历数据源,当数据量较大时,这个方案就不推荐了,性能比较差。

所以想到第二个方案,通过algo的map接口,创建MapFunction,内部创建自定义排序

2.2实现方案

调用algo的map接口,创建一个MapFunction实例,在实例中自定义排序规则


三、实现过程

1、创建报表,并关联数据源

image.png


案例中,报表将依据表单“汉字拼音”中拼音字段排序

数据源

image.png

2、报表中添加排序字段,不需要关联映射实体

image.png

3、编写报表取数插件,继承import kd.bos.entity.report.AbstractReportListDataPlugin

public class ReportTest1 extends AbstractReportListDataPlugin {

//重写query方法
    @Override
    public DataSet query(ReportQueryParam reportQueryParam, Object o) throws Throwable {
        DataSet orders = QueryServiceHelper.queryDataSet("algokey", "表单标识", "selecFields查询字段", 过滤条件filters, "排序字段 asc");
        //调用map接口,创建MapFunction
        orders=orders.map(new RownumMap(orders.getRowMeta()));
        return orders;
    }
}

4、创建MapFunction实例,自定义排序逻辑

public class RownumMap extends MapFunction {

    private RowMeta rowMeta;
    private int rownum = 0;

//Dataset中添加排序字段
    public RownumMap(RowMeta sourceMeta) {
        Field[] fields = sourceMeta.getFields();
        Field[] newFields = Arrays.copyOf(fields, fields.length + 1);   
        newFields[newFields.length - 1] = new Field("排序字段标识", DataType.IntegerType);
        this.rowMeta = new RowMeta(newFields);
    }
    //自定义排序并赋值
    @Override
    public Object[] map(Row row) {
        Object[] newRow = new Object[rowMeta.getFieldCount()];
        for (int i = 0; i < rowMeta.getFieldCount() - 1; i++) {
            newRow[i] = row.get(i);
        }
        newRow[newRow.length - 1] = rownum++;
        return newRow;
    }

    @Override
    public RowMeta getResultRowMeta() {

        return rowMeta;
    }

四、效果图

赋值前

image.png

排序赋值后

image.png

五、开发环境版本

V5.0.011

六、注意事项

需要注意MapFunction实例每次计算都要实例化一个新的,不然会有性能问题,不可以重复使用。

七、参考资料

开发平台

学习成长中心

八、源代码





源码.zip(6.98KB)

图标赞 2
2人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!

您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!

请选择打赏金币数 *

10金币20金币30金币40金币50金币60金币
可用金币: 0