如何实现合并打印
场景一:
同一单据的一张单内的合并打印
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:选择合并依据...
点击下载文档
上一篇:大数据量查询缓慢?快速搜索来帮忙!下一篇:如何在单据列表批量上传附件
本文2024-09-23 00:36:38发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-140574.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章