本文介绍了在单据体分录列过多时,如何通过在打印模板中添加自定义数据源并编写插件代码,以实现单据体数据在两个或多个数据表格中分开打印的解决方案。文中详细说明了需求背景、实现方案、实现过程(包括创建打印页面、配置数据源、编写插件类、选择自定义数据源等步骤),并展示了最终效果图和开发环境版本信息。同时,还提醒了使用旧版本打印模板的注意事项和参考资料。
关键词:打印模板
一、需求背景
单据体分录列过多,使用一个数据表格打印不完,这时就可以将单据体数据拆成两个或多个,使用多个数据表格打印,但是如果多个数据表格绑定通过数据源(单据体)就会只加载一次数据,就会出现第二个数据表格数据不全,此时我们就可以使用自定义数据源,在代码中干预拉取数据。
二、实现方案
在打印模板上面添加自定义数据源,通过插件代码后台去干预拉取数据。
三、实现过程
3.1首先创建根据模板创建打印页面,在打印页面上先添加一个网格控件,根据需要可以合并拆分单元格,然后选择其中的一个网格单元格添加数据表格。如下图3.1所示
图3.1
3.2然后选择根节点(采购申请打印)配置数据源,选择数据表格节点配置需要打印的具体的字段的数据源(可以是单据体、单据头、自定义数据源等)如下图3.2所示
图3.2
3.3配置自定义数据源,编写插件类实现分两个表格打印单据体数据,如下图3.3所示:
图3.3
public class customPrintDataEntities extends AbstractPrintServicePlugin { @Override public void customPrintDataEntities(CustomPrintDataEntitiesArgs e) { super.customPrintDataEntities(e); //新的数据包 List<DynamicObject> newDataEntities=new ArrayList<>(); //数据源的标识 String dataSourceName=e.getDataSourceName(); //自定义字段的集合 Set<String> customFields=e.getCustomFields(); //查询的数据包 List<DynamicObject> dataEntities=e.getDataEntities(); //查询当前单据的pkid Object billId=e.getPKId(); if(dataSourceName!=null && "entry_two".equals(dataSourceName)){ //多个单据的数据包 DynamicObjectCollection queryCol= ORM.create().query("kdec_purcharebill",null); //我们需要的分录的数据包 List<DynamicObject> customDataEntites=queryCol.stream().flatMap(dataEntity -> dataEntity.getDynamicObjectCollection("entryentity").stream()). collect(Collectors.toList()); newDataEntities.addAll(customDataEntites); e.setDataEntities(newDataEntities); } } }
3.4配置好数据源以后,在第二个数据表格配置数据源的时候选择自定义数据源,如下图3.4所示
图3.4
四、效果图
4.1最终可以预览看到打印界面的效果图如图4.1所示:
图4.1
五、开发环境版本
不限,本样例采用的轻量级环境,版本是: 苍穹版本号 COSMICV4.0.014.0 星瀚版本号 CONSTELLATIONV4.0.014.0
六、注意事项
本案例是旧版本打印模板,如果使用的是苍穹4.0版本的打印,默认支持使用同一个数据源进行多数据表格分开打印。编写插件类的时候一定要注意对应的标识,配置自定义数据源的标识跟单据上的标识保持一致。
七、参考资料
参考附件中的代码补丁
元数据直接在开发平台导入
源代码直接在开发工具idea/eclipse中导入
单据体分两个数据表格打印.zip(13.12KB)
推荐阅读