本文介绍了如何将单据明细行的多个字段数据拼接后汇总到单据头的多行文本字段中进行展示,以解决库管、物流及费用报销等场景中的需求。具体步骤包括在BOS IDE中增加“分录字段汇总”和“产品明细汇总”字段,配置实体服务规则或Python服务插件来自动更新这些字段的值,实现明细行数据汇总到单据头的功能。同时,文章还讨论了变更单更新源单后自动触发更新字段的机制。
拼接单据明细字段汇总到单据头“多行文本”字段进行记录
一、业务背景
很多客户的业务场景中,可能会有将某单据明细行的某些字段数据拼接,然后汇总展示到单据头的需求!比如:
1、库管在收发货物时,查看采购入库单和销售出库单的单据,由于明细行的数据字段较多,可能无法精准确定发货的主要货物信息;
2、库管与物流快递对接时,往往需要快递单的货物明细提交物流系统,但是由于库存单据的明细行数据字段繁多,无法准确快速获取对应的信息;
3、再如,一些费用报销场景,费用专员可能会不想直接去看明细行的繁杂数据,想要在费用报销单的单据头,直接查看处理过的费用明细汇总;
等等场景,一定都想实现汇总明细行多个字段的数据到一个单据头字段进行展示!
那么我们应该如何满足这一类的需求呢?
我先提供一个需求场景:
某企业需要在销售订单上展示汇总明细行的货物信息“什么产品,下单数量,单位是什么?”
如何汇总到单据头中呢?
2023.12.27补充:
感谢 @脾气超差 提供的业务需求场景,丰富了该使用技巧的应用范围!
问题与解决方案详见如下问答
二、关键步骤
1、字段准备
需求场景当中需要将明细行多个字段数据汇总到单据头,但是一个单据的明细行是多行的,这样的话,我们就要想一些办法,先将每行明细拼起来进行汇总,然后再将明细行的这个汇总字段拼接到单据头的一个汇总字段中,总结如下:
①拼接明细行多个字段到“分录字段汇总”的明细行汇总字段
②拼接①中的“分录字段汇总”字段到单据头“产品明细汇总”字段,拼接到单据头可能存在换行需求,那么“产品明细汇总”字段一定要是个“多行文本”字段;
1.1、在BOS IDE中增加“分录字段汇总”字段
字段类型:文本
编辑长度:500
锁定性:3(防止因编辑导致的数据错误)
保存拓展,看效果!
1.2、在BOS IDE中增加“产品明细汇总”字段
字段类型:多行文本
编辑长度:1000
锁定性:3(防止因编辑导致的数据错误)
宽度、高度:可根据字段显示的需求调节
保存拓展,看效果!
2、如何让“分录字段汇总”根据需求字段进行拼接后自动更新值?
这里我们为什么增加这个字段,已经在第一步中,表达过了,那么现在如何在录入明细行数据后字段对应字段信息到这个“分录字段汇总”的文本字段中去呢?
这里我们使用销售订单“订单明细”的实体服务规则进行处理!
新增“订单明细”实体服务规则:
规则名称:自定义-分录字段汇总
规则条件:字段=字段
条件值:FMaterialId = FMaterialId OR FUnitID = FUnitID OR FQty = FQty
当规则条件成立时,执行一个“计算值更新”
新增服务
服务类型:计算定义公式的值并填写到指定列
勾选:值更新、新增、行重置、行删除、集合重置
服务描述:汇总产品名称+销售数量+销售单位信息
公式:这里使用了拼接函数和很多python函数以达到效果;
F_ORA_FLZDHZ = '产品:' + format(FMaterialId.FName) + ',数量:' + str(FQty).rstrip('0').rstrip('.') + ',单位:' + format(FUnitID) if '.' in str(FQty) else '产品:' + format(FMaterialId.FName) + ',数量:' + str(FQty) + ',单位:' + format(FUnitID)
配置完成后,保存拓展,我们到客户端看一下效果!
3、如何让每一行“分录字段汇总”的值进行拼接后自动汇总到单据头的“产品明细汇总”?
现在每一个明细行都有“分录字段汇总”的字段值了,那么怎么让这每一个明细行的“分录字段汇总”进行拼接到单据头的“产品明细汇总”的多行文本字段中呢?
这里提供两种方式:(选择其一,不是都配置哈)
1、使用“基本信息”实体服务规则;(更新立即触发)
2、使用单据“操作列表”的【保存】上挂“python服务插件”(保存执行触发)
3.1、使用“基本信息”实体服务规则;
这里提供“基本信息”实体服务规则的配置脚本和配置图,如下
新增“基本信息”实体服务规则:
规则名称:明细分录汇总到单据头产品明细汇总
规则条件:明细信息不为空 且 分录字段汇总不为空
条件值:FSaleOrderEntry <> null AND F_ORA_FLZDHZ <> null
当规则条件成立时,执行一个“计算值更新”
新增服务
服务类型:计算定义公式的值并填写到指定列
勾选:值更新、新增、行重置、行删除、集合重置
服务描述:明细分录汇总到单据头产品明细汇总
公式:这里使用了拼接函数和很多python函数以达到效果;
F_ORA_CPMXHZ = ';\n'.join((map(lambda x:x.F_ORA_FLZDHZ,filter(lambda x:x.F_ORA_FLZDHZ <> null, FSaleOrderEntry))))
保存拓展!可查看效果!(见“最终效果的1”)
3.2、使用单据“操作列表”的【保存】上挂“python服务插件”
这里提供二开单据“操作列表”的【保存】配置图与python脚本,如下:
##****************************服务插件******************* #引入clr运行库 import clr #添加对cloud插件开发的常用组件的引用 clr.AddReference('System') clr.AddReference('System.Data') clr.AddReference('Kingdee.BOS') clr.AddReference('Kingdee.BOS.Core') clr.AddReference('Kingdee.BOS.App') clr.AddReference('Kingdee.BOS.DataEntity') clr.AddReference('Kingdee.BOS.Contracts') clr.AddReference('Kingdee.BOS.ServiceHelper') clr.AddReference('Newtonsoft.Json') #导入cloud基础库中的常用实体对象(分命名空间导入,不会递归导入) from Kingdee.BOS import * from Kingdee.BOS.Core import * from Kingdee.BOS.Contracts import * from Kingdee.BOS.Orm.DataEntity import * from Kingdee.BOS.DataEntity import * from Kingdee.BOS.Core.Bill import * from Kingdee.BOS.Core.DynamicForm import * from Kingdee.BOS.Core.DynamicForm.PlugIn import * from Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel import * from System import * from System.Data import * from Kingdee.BOS.App.Data import * from System.Collections.Generic import List from Kingdee.BOS.ServiceHelper import * from Newtonsoft.Json import JsonConvert from Newtonsoft.Json.Linq import * def BeginOperationTransaction(e): for billObj in e.DataEntitys: billId=billObj["Id"];#单据ID billNo=billObj["BillNo"];#单据编号 en=billObj["SaleOrderEntry"]; list=(r["F_ORA_FLZDHZ"] for r in en); billObj["F_ORA_CPMXHZ"]=";\n".join(list);
注册时会提示这个,忽略即可。直接确认!
保存拓展!可查看效果!(见“最终效果的2”)
三、最终效果
1、使用“基本信息”实体服务规则效果;
实体服务规则是即时生效的,因此可以在编辑单据时立即生效,实时变化!
2、使用单据“操作列表”的【保存】上挂“python服务插件”实现;
保存插件是保存操作时才会触发的,因此可以在编辑单据时不会立即更新到单据头,保存后才会更新单据头“产品明细汇总”字段!
四、特别提示
1、本使用技巧文章中所述的两种方法均在“销售订单”场景下,生效!其他单据也可类比生效!
2、单从“销售订单”场景来说,这张单据中可能会发生“变更”的操作!那么就一定有人会问:
源单如果通过“订单变更单”“订单新变更单”等进行了修改变更,那么这个单据头的字段会不会一起改变?是否需要再变更单中进行编辑?
我的回答是:不需要在变更单放开锁定性对该字段进行编辑!以上两种方式都会在变更单更新源单后,再次执行【实体服务规则】or【保存插件】进行触发!
换句话讲,上述配置完成后,完全可以适配修改变更的场景!无需另外进行其他任何配置!
推荐阅读