如何实现合并打印

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

如何实现合并打印

场景一:  

同一单据的一张单内的合并打印


1、适用版本

金蝶云苍穹 V4.0.014以上


2、解决方案

步骤1:点击数据表格的数据行

步骤2:选择合并依据字段(只能选中数据行中配置的字段),可以有多个合并依据字段

步骤3:选择需要汇总的字段,

若合并汇总字段为数值类字段时,则汇总字段进行相加。

若合并汇总字段为文本类字段时,则多个内容以逗号相隔汇总在一个单元格中。

单据数据:

打印结果:




场景二: 

同一单据的多单合并打印


1.1、适用版本

金蝶云苍穹 V6.0.9及以上


2.1、解决方案

步骤1:开启多单合并打印参数:

步骤2:设置合并依据字段和合并汇总字段


单据数据:


打印结果:


2.2、适用版本

金蝶云苍穹 V6.0.9以下


3.2、解决方案

以采购申请的一个常见场景为例,把同一个申请人的单据合并打印在一张纸上,不同的申请人进行分页。并将单据体中的金额合并计算后以中文大写金额打印在头部上,在数据表格(单据体)中展示单据编号、单据状态、物料名称、申请数量、单价、金额等信息


打印模板的配置:

二开打印插件:

package plugin.print;

import akka.util.Switch;
import kd.bos.print.core.data.DataRowSet;
import kd.bos.print.core.data.field.CollectionField;
import kd.bos.print.core.data.field.Field;
import kd.bos.print.core.data.field.TextField;
import kd.bos.print.core.plugin.AbstractPrintPlugin;
import kd.bos.print.core.plugin.event.*;
import kd.bos.print.core.plugin.event.bo.PWGridCellBo;
import kd.sdk.plugin.Plugin;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

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

        //分录标识
        private static final String ENTRY="entryentity";

        //申请人名称的标识
        private static final String APPLYNAME="pio1_basedatafield.name";

        //单据编码标识
        private static final String BILLNO="billno";

        //单据状态的标识
        private static final String BILLSTATUS="billstatus";

        //分录的标识
        private static final String ENTRYDATASOUCE="pio1_testforfile.entryentity";

        @Override
        public void afterLoadData(AfterLoadDataEvent evt) {
                //获取单据数据
                List<DataRowSet> dataRowSets = evt.getDataRowSets();

                //构造合并分页数据
                List<DataRowSet> newDataRowSets=new ArrayList<>(10);

                //遍历每条单据
                for (DataRowSet dataRowSet : dataRowSets) {
                        //此申请人的数据是否在newDataRowSets中
                        Boolean isexist=false;

                        //获取分录数据
                        List<DataRowSet> entryrow = dataRowSet.getCollectionField(ENTRY).getValue();

                        //单据头的编码和状态添加到分录的每条数据
                        for (DataRowSet rowSet : entryrow) {
                                rowSet.put(BILLNO,dataRowSet.getField(BILLNO));
                                rowSet.put(BILLSTATUS,dataRowSet.getField(BILLSTATUS));
                        }
                        //单据头的编码清空
                        dataRowSet.remove(BILLNO);
                        //单据头的状态清空
                        dataRowSet.remove(BILLSTATUS);

                        //遍历已经合并的数据,检查是否存在相同的申请人,则合并在一起
                        for (DataRowSet newDataRowSet : newDataRowSets) {
                                //是否在newDataRowSets中已经存在此申请人,有则进行分录数据的合并
                                if( dataRowSet.getField(APPLYNAME).getValue().equals(newDataRowSet.getField(APPLYNAME).getValue()))
                                {
                                        //获取此申请人的分录数据
                                        List<DataRowSet> newentryrow = newDataRowSet.getCollectionField(ENTRY).getValue();
                                        //申请人相同的分录数据合并
                                        newentryrow.addAll(entryrow);
                                        isexist=true;
                                        break;
                                }
                        }
                        //此申请人在newDataRowSets中不存在
                        if(!isexist){
                                newDataRowSets.add(dataRowSet);
                        }
                }
                //把合并的数据设置回去
                evt.setDataRowSets(newDataRowSets);
        }


        @Override
        public void beforeOutputWidget(BeforeOutputWidgetEvent evt) {

               if("DataGrid".equals(evt.getWidgetKey()))
               {
                       //修改数据表格中单据编号的绑定字段,修改前是 ds:pio1_testforfile  f:billno     修改后是 :ds:pio1_testforfile.entryentity f:billno
                       PWGridCellBo cell1 = ((BeforeOutputGridEvent) evt).getCell(1, 0);
                       cell1.setCellValue(ENTRYDATASOUCE,BILLNO);

                       //修改数据表格中单据状态的绑定字段
                       PWGridCellBo cell2 = ((BeforeOutputGridEvent) evt).getCell(1, 1);
                       cell2.setCellValue(ENTRYDATASOUCE,BILLSTATUS);

               }

        }



}

打印单据:

打印结果:

注意事项:

1、DataRowSet相当于单据中的一条数据,打印中会根据DatarowSet进行分页,如果不希望分页就放在同一个DataRowSet中,当内容占满一页的时候才会进行分页

2、合并打印的本质实际上就是构造DataRowSet,在afterLoadData中只会加载打印模板中配置的字段,如果需要使用其他字段可以beforeLoadData中去添加需要查询的字段,可以使下面两个方法

public PrtDataSource getDataSource() {
    return this.dataSource;
}

public List<String> getQueryField() {
    if (this.queryField == null) {
        this.queryField = new ArrayList();
    }

    return this.queryField;
}


如果还想了解DataRowSet更多细节,可以关注一下,我的下一篇文章

如何实现合并打印

场景一: 同一单据的一张单内的合并打印1、适用版本金蝶云苍穹 V4.0.014以上2、解决方案步骤1:点击数据表格的数据行步骤2:选择合并依据...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息