对报表的查询结果进行重新计算后,合计值还是修改前的结果解决方案

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

对报表的查询结果进行重新计算后,合计值还是修改前的结果解决方案

1 业务背景

项目开发中,报表经常会遇到根据某个特定条件需要修改显示结果。比如修改金额的值,对应的合计值应该也要被更新。

2 遇到的问题

通常我们的二开方案往往会使用processRowData方法,来改变结果。这种方法只可以修改字段值,但没办法修改合计值

public void processRowData(String gridPK, DynamicObjectCollection rowData, ReportQueryParam queryParam) {
    super.processRowData(gridPK, rowData, queryParam);
    Iterator<DynamicObject> iterator = rowData.iterator();
    while (iterator.hasNext()) {
        DynamicObject row = iterator.next();
        if(row.get("lago_reqdetail").equals("笔记本")){
            row.set("lago_reqamount", 200);
        }

    }

}


也许有人会说可以重写setFloatButtomData方法来修改合计值。但是这个方法的弊端是需要提前知道合计的结果才能更新。所以这条路也是行不通的。


3 解决方案

3.1 方案总述

  • 需要在报表取数插件中对已经计算出结果的DataSet进行处理,通过DataSetBuilder创建一个新的DataSet并修改值返回到前端渲染即可

3.2 实现步骤

修改报表查询取数插件

public DataSet query(ReportQueryParam reportQueryParam, Object o)  {
               //源报表查询取数逻辑,得到resultDataSet返回到前端
       DataSet repDataSet = QueryServiceHelper.queryDataSet(getClass().getName(), "lago_reqbi        ll", "id,lago_requser,lago_reqdetail,lago_reqdate,lago_reqamount,lago_orderbillno", null, null);

       DataSet orderDataSet = QueryServiceHelper.queryDataSet(getClass().getName(), "lago_orderbill", "id,billno,lago_orderdate,lago_orderuser,lago_orderamount", null, null);
       
       DataSet resultDataSet = repDataSet.join(orderDataSet).on("lago_orderbillno", "billno").          select("lago_orderbillno","lago_requser","lago_reqdetail","lago_reqdate","lago_reqamount","lago_orderdate","lago_orderuser","lago_orderamount").finish();

        //创建新的DataSet,将resultDataSet值复制给新DataSet,并完成值更新
        RowMeta rowMeta= resultDataSet.getRowMeta();
        DataSetBuilder newDataSetBuilder = Algo.create("test").createDataSetBuilder(rowMeta);
        int lagoReqamount = rowMeta.getFieldIndex("lago_reqamount");
        while(resultDataSet.hasNext()){
            Row row = resultDataSet.next();
            Object[] values = new Object[row.size()];
            for(int i=0;i<row.size();i++){
                if(row.get("lago_reqdetail").equals("笔记本")&&i==lagoReqamount){
                    values[i]="300";//修改值
                }else{
                    values[i]=row.get(i);
                }
            }
            newDataSetBuilder.append(values);
        }
        //创建新DataSet
        DataSet newDataSet = newDataSetBuilder.build();
    
        return newDataSet;
}


3.3 实现效果

4 注意事项

1、此方案对性能有一定影响,报表本身是用来做查询不适合做修改值。建议减少在报表中做修改值的场景。如果不要求显示合计,直接使用processRowData修改值即可。


5 源码


源码.zip







对报表的查询结果进行重新计算后,合计值还是修改前的结果解决方案

1 业务背景项目开发中,报表经常会遇到根据某个特定条件需要修改显示结果。比如修改金额的值,对应的合计值应该也要被更新。2 遇到的问题...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息