如何实现按每条分录数据分页打印

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

如何实现按每条分录数据分页打印

 1 问题描述

目前打印模板中数据表格控件有一个“每页打印行数”属性可以设置每页固定打印的行数,但当打印模板中配置了子数据表格的时候是不可用的(看不见这个属性),因此输出此文章提供一些解决方案。这个属性没有出现的原因是产品考虑到添加子数据表格后,不能保证固定数据表格的每页打印行数。

解决方法

打印模板配置:

继承打印插件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都适用


扩展知识

DataRowSet类:

打印存储单据数据的对象,里面会加载打印模板上绑定字段的数据及单据id,每一个DataRowSet对应一条单据

DataRowSet中使用row属性字段来存储数据,row为Map<String,Filed>类型,其中的key是字段的标识,vlue存储的是具体的数据使用Filed对象表示。



Field对象:

存储打印模板上控件绑定的数据

继承图谱:



常用的主要是:

ColletionField 存储分录的数据

TextField存储的文本数据,一般使用的是文本控件或者单据上这个字段类型就是String

LongField存储Long数据,一般是存单据id之类的

DateTimeField存储日期数据

DecimalField存储小数字段,如金额


很多客户打印二开的需求本质上都是构造DataRowSet数据,每个DataRowSet之间会有分页,如果想数据展示在一起就把数据合并在这个DataRowSet里面。


如何实现按每条分录数据分页打印

1 问题描述目前打印模板中数据表格控件有一个“每页打印行数”属性可以设置每页固定打印的行数,但当打印模板中配置了子数据表格的时候是...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息