报表设置行排序字段并赋值原创
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、创建报表,并关联数据源
案例中,报表将依据表单“汉字拼音”中拼音字段排序
数据源
2、报表中添加排序字段,不需要关联映射实体
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; }
四、效果图
赋值前排序赋值后
五、开发环境版本
V5.0.011
六、注意事项
需要注意MapFunction实例每次计算都要实例化一个新的,不然会有性能问题,不可以重复使用。
七、参考资料
八、源代码
源码.zip(6.98KB)
赞 2
2人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读
您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!
请选择打赏金币数 *
10金币20金币30金币40金币50金币60金币
可用金币: 0