套打中如何实现按条件汇总的打印效果

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

套打中如何实现按条件汇总的打印效果

1 业务背景

客户希望在数据表格的合计行对满足特定条件的数据进行合计或者格式化操作,如直接使用打印模板的公式 - sum(if(条件,xx,xxx))无法实现效果,这里只会计算数据表格的第一行,不满足业务需求。


2 思路与方案 

继承打印模板的插件AbstractPrintPlugin ,在afterOutputWidget事件中获取输出数据,对数据进行合计然后再设置回合计行。


3 实现步骤

步骤1:打印模板的配置


步骤二:继承AbstractPrintPlugin,实现afterOutputWidget事件

package demo;

import kd.bos.dataentity.entity.LocaleString;
import kd.bos.dataentity.resource.ResManager;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.print.core.data.DataRowSet;
import kd.bos.print.core.data.field.CollectionField;
import kd.bos.print.core.data.field.DecimalField;
import kd.bos.print.core.data.field.Field;
import kd.bos.print.core.data.field.TextField;
import kd.bos.print.core.model.widget.grid.AbstractPWGrid;
import kd.bos.print.core.model.widget.grid.datagrid.PWNormalRow;
import kd.bos.print.core.model.widget.grid.datagrid.cellvalue.ACellValue;
import kd.bos.print.core.plugin.AbstractPrintPlugin;
import kd.bos.print.core.plugin.event.AfterLoadDataEvent;
import kd.bos.print.core.plugin.event.AfterOutputGridEvent;
import kd.bos.print.core.plugin.event.AfterOutputWidgetEvent;
import kd.bos.print.core.plugin.event.bo.PWGridBo;
import kd.bos.print.core.plugin.event.bo.PWGridCellBo;
import kd.bos.print.core.plugin.event.bo.PWGridRowBo;
import kd.bos.print.core.plugin.event.bo.PluginDataVisitorBo;
import kd.bos.servicehelper.QueryServiceHelper;
import kd.sdk.plugin.Plugin;

import java.math.BigDecimal;
import java.util.Iterator;
import java.util.List;

/**
 * 新的打印插件
 */
public class printSum extends AbstractPrintPlugin implements Plugin {

    //数据表格的标识
    private static final String DATAGRID="DataGrid";

    @Override
    public void afterOutputWidget(AfterOutputWidgetEvent evt) {
        //判断是否数据表格
        if(DATAGRID.equals(evt.getWidgetKey()))
        {
            //获取数据表格
            PWGridBo grid = ((AfterOutputGridEvent) evt).getGrid();

            //获取所有数据行信息包含标题行和合计行
            List<PWGridRowBo> outputRows = grid.getOutputRows();
            Iterator<PWGridRowBo> iterator = outputRows.iterator();

            Double sum=0d;

            while (iterator.hasNext())
            {
                PWGridRowBo next = iterator.next();

                //判断此条数据是否是数据行数据
                if(next.isDetailRow())
                {
                    //获取第一列数据--计价数量字段
                    PWGridCellBo cell = next.getCell(0);

                    //获取第二列数据--辅助计价
                    PWGridCellBo cell1 = next.getCell(1);

                    //判断是否是需要合计的数据,本案例是希望辅助计价为是的时候合计计价数量字段
                    //如果是多语言的环境,可以使用QueryServiceHelper.queryDataSet方法查询辅助计价字段来进行精确的判断,数据库存的是0或1,可看下图
                    if("是".equals(cell1.getOutputText()))
                    {
                        sum+=cell.getOutputText().isEmpty() ? 0 :Double.valueOf(cell.getOutputText());
                    }
                }
            }
            //获取数据行,设置合计数据
            outputRows.get(grid.getOutputRowCount()-1).getCell(0).setOutputText(sum.toString());
        }
    }
}


辅助计价在数据库存的值


步骤三:注册二开插件demo.printSum


步骤四:打印效果

套打中如何实现按条件汇总的打印效果

1 业务背景客户希望在数据表格的合计行对满足特定条件的数据进行合计或者格式化操作,如直接使用打印模板的公式 - sum(if(条件,xx,xxx))...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息