如何在报表中按组织生成多个合计行原创
金蝶云社区-吴锐雄
吴锐雄
7人赞赏了该文章 1,620次浏览 未经作者许可,禁止转载编辑于2023年05月10日 09:17:49


关键词:报表,合计,组织


一、需求

二开库存报表,按组织进行分组,合计每一组的物料数量。


二、思路与方案

使用报表取数插件,自定义取数,查询出DataSet之后,用algo的groupBy、sum计算每个组织的数量,然后用union将合计的结果集与原DataSet进行合并,最后用groupBy进行第二次分组。


三、实现过程

1.创建报表

image.png


拖入一些字段

image.png


2.编写报表取数插件并注册

image.png


重新报表取数插件,取数方法

@Override
public DataSet query(ReportQueryParam reportQueryParam, Object o) throws Throwable {

    // 查询“初始库存表”,查询4字段,分别是 组织名称,单据体的物料,单据体的期初数量,单据体的计量单位
    DataSet dataSet = QueryServiceHelper.queryDataSet(getClass().getName(), "im_initbill",
            "org.name as kdec_org_name, billentry.material as kdec_material, billentry.qty as kdec_qty, billentry.unit as kdec_unit" ,
            null,
            null);
    // dataSet使用groupBy对组织名称进行分组, 生成一个GroupbyDataSet对象
    GroupbyDataSet groupbyDataSet = dataSet.groupBy(new String[]{"kdec_org_name"});
    // 合计期初数量,生成合计行
    DataSet dataSetSum = groupbyDataSet.sum("kdec_qty").finish();
    // 由于groupBy仅指定了一个“组织名称”字段,此时dataSetSum里面没有其他剩余2个,因此,还要添加2个Field
    dataSetSum = dataSetSum.addField("0L","kdec_material").addField("0L","kdec_unit");
    // 修改合计行的值,拼接上'的合计'
    dataSetSum = dataSetSum.select("concat(kdec_org_name+'的合计') as kdec_org_name,kdec_material,kdec_qty,kdec_unit");

    // 将原dataSet与合计之后的dataSet用union进行合并
    DataSet dataSetUnion = dataSet.union(dataSetSum);
    // 再次使用groupBy对合并之后的数据进行分组
    dataSetUnion = dataSetUnion.groupBy(new String[]{"kdec_org_name", "kdec_material", "kdec_qty","kdec_unit"}).finish();
    return dataSetUnion;
}


四、效果图

如图,按组织对数据进行了统计

image.png


五、开发环境版本

不限


六、参考资料

报表开发

如何根据条件设置报表单元格合并



赞 7