本文介绍了在金蝶系统中增加批号主档自定义字段,并在单据保存时更新这些字段的过程。由于系统预置的“保存并更新批号主档”服务无法直接修改,因此需要通过二次开发(二开)实现。具体步骤包括扩展单据和批号主档表头、编写保存操作服务端插件以更新批号主档,并在出库单上携带这些自定义字段。文中还给出了插件实现的代码示例,并解释了系统不支持直接添加自定义字段的原因。
一、【问题背景】:需要批号主档里面增加自定义字段,做单据的时候把自定义字段写进批号主档,出入库单选批号时将批号主档自定义字段带出来
二、【说明】
1、单据在"保存"操作中配置有"保存并更新批号主档"服务,该通用服务无法修改,只能二开保存插件写入数据
2、按照服务的执行顺序,保存操作先执行"保存并更新批号主档"服务,后执行保存插件中的逻辑,在插件中可以拿到保存的批号内码,以此作为更新的条件
三、【二开实现】:这里以"其他入库单"为例,说明具体的二开过程
1、扩展其他入库单表头,添加"批号备注"文本字段
2、扩展"批号主档"表头,添加"备注"文本字段
3、添加"保存"操作服务端插件,获取到单据的"批号备注信息"及单据体分录的批号,更新写入批号主档,代码逻辑参考附件
【实现效果】
4、将批号主档中的自定义字段携带到出库单上
import clr clr.AddReference('Kingdee.BOS.ServiceHelper') from Kingdee.BOS.ServiceHelper import * from System import StringComparison def DataChanged(e): if e.Field.Key.Equals("FLot", StringComparison.OrdinalIgnoreCase): orgId = 0 materialId = 0 lot = this.View.Model.GetValue("FLot", e.Row) stockOrgObj = this.View.Model.GetValue("FStockOrgId") if stockOrgObj is not None: orgId = str(stockOrgObj["Id"]) matObj = this.View.Model.GetValue("FMaterialId", e.Row) if matObj is not None: materialId = str(matObj["msterId"]) sqlText = "SELECT FLOTNOTE FROM T_BD_LOTMASTER WHERE FBIZTYPE='1' AND FLOTSTATUS <> '2' AND FNUMBER = '" + str(lot) + "' AND FMATERIALID = " + str(materialId) + " AND FUSEORGID = " + str(orgId) dyObjs = DBServiceHelper.ExecuteDynamicObject(this.Context, sqlText) if dyObjs.Count > 0: for item in dyObjs: this.View.Model.SetValue("FEntryNote", item["FNOTETEXT"], e.Row) else: this.View.Model.SetValue("FEntryNote", "", e.Row)
说明:
系统预置的保存更新批号主档的服务不支持批号添加自定义字段,主要原因可能是:
1、批号主档预置的字段可以理解为后续为相关的业务逻辑服务(类似于即时库存的维度),批号主档并不会去预置涵盖各种字段(比如采购入库单中的采购价格),该服务为通用服务,可能配置在不同的业务单据(如:生产入库、采购入库、其他入库等), 动态扩展的二开字段在配置阶段无法进行获取配置
MiscellaneousSaveExt.rar(1.73KB)
推荐阅读