如何实现按每条分录数据分页打印
1 问题描述
目前打印模板中数据表格控件有一个“每页打印行数”属性可以设置每页固定打印的行数,但当打印模板中配置了子数据表格的时候是不可用的(看不见这个属性),因此输出此文章提供一些解决方案。这个属性没有出现的原因是产品考虑到添加子数据表格后,不能保证固定数据表格的每页打印行数。
2 解决方法
打印模板配置:
继承打印插件kd.bos.print.core.plugin.AbstractPrintPlugin,在afterLoadData里面把每一条分录数据划分出来,分录的DataRowSet里面包含了子单据的数据,所以子单据不用再划分了。
两条DataRowSet对应列表上面的两条数据
看0这条DataRowSet里面存了分录数据和此条数据的id,这块是只会加载出打印模板中配置字段的数据(id会默认加载),可以在beforeLoadData事件中设置PrtDataSource类中的queryField字段来设置需要需要加载数据的字段。
key为“entryentity”里面存了3条分录数据,每一条数据也是DataRowSet类型,把每条数据拆分出来就能实现上面的需求
拆分后的数据:
打印效果:
二开代码:
package printplugin; import kd.bos.logging.Log; import kd.bos.logging.LogFactory; import kd.bos.print.core.data.DataRowSet; import kd.bos.print.core.data.datasource.PrtDataSource; import kd.bos.print.core.data.field.CollectionField; import kd.bos.print.core.plugin.AbstractPrintPlugin; import kd.bos.print.core.plugin.event.AfterLoadDataEvent; import kd.sdk.plugin.Plugin; import java.util.ArrayList; import java.util.List; /** * 新的打印插件 */ public class PagingPrint extends AbstractPrintPlugin implements Plugin { private static Log log= LogFactory.getLog(PagingPrint.class); public static final String ENTRYKEY="entryentity"; public static final String TPLTABLEKEY="DataGrid"; public static final String FORMID="pio1_sufhsf"; @Override public void afterLoadData(AfterLoadDataEvent evt) { //获取待打印的数据 List<DataRowSet> dataRowSets = evt.getDataRowSets(); List<DataRowSet> result=new ArrayList(); if(FORMID.equalsIgnoreCase(evt.getDataSource().getDsName())) { for (DataRowSet dataRowSet : dataRowSets) { //获取模板绑定业务实体的分录数据(只包含模板中配置字段的数据) List<DataRowSet> entry = dataRowSet.getCollectionField(ENTRYKEY).getValue(); //遍历分录数据,把每条分录单独拆出来 for(DataRowSet entryDataRowSet:entry) { ArrayList<DataRowSet> oneEntry = new ArrayList<>(); oneEntry.add(entryDataRowSet); //复制单据数据,已保证只修改分录中的数据 DataRowSet dataRowSetCopy = dataRowSet.deepCopy(); dataRowSetCopy.put(ENTRYKEY,new CollectionField(oneEntry)); result.add(dataRowSetCopy); } } } evt.setDataRowSets(result); } }
3 使用版本
新打印插件AbstractPrintPlugin都适用
4 扩展知识
DataRowSet类:
打印存储单据数据的对象,里面会加载打印模板上绑定字段的数据及单据id,每一个DataRowSet对应一条单据
DataRowSet中使用row属性字段来存储数据,row为Map<String,Filed>类型,其中的key是字段的标识,vlue存储的是具体的数据使用Filed对象表示。
Field对象:
存储打印模板上控件绑定的数据
继承图谱:
常用的主要是:
ColletionField 存储分录的数据
TextField存储的文本数据,一般使用的是文本控件或者单据上这个字段类型就是String
LongField存储Long数据,一般是存单据id之类的
DateTimeField存储日期数据
DecimalField存储小数字段,如金额
很多客户打印二开的需求本质上都是构造DataRowSet数据,每个DataRowSet之间会有分页,如果想数据展示在一起就把数据合并在这个DataRowSet里面。
如何实现按每条分录数据分页打印
本文2024-09-23 00:35:35发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-140460.html