【Python】采购入库单有条件的校验分录行必须关联生成原创
99人赞赏了该文章
424次浏览
编辑于2024年05月19日 19:53:22
需求背景:
单据类型的选项勾选所有分录行关联生成后,则单据保存的时候,就会无条件校验该单据类型任何场景的所有分录行都必须关联生成,也就是必须要有源单。但有些时候可能需要排除特定物料,例如采购入库单希望如果物料编码为1开头,就可以直接保存,而无需从采购订单下推。
解决方法:
本质上这个保存校验的校验器名称是BillLinkValidator,我们可以编写保存服务插件,遍历表体每一行,如果物料编码左包含1开头,则动态移除校验器:
import clr clr.AddReference('System') clr.AddReference('Kingdee.BOS') clr.AddReference('Kingdee.BOS.Core') from System import * from Kingdee.BOS.Core import * from Kingdee.BOS.Core.Validation import * from Kingdee.BOS.Log import Logger def OnAddValidators(e): # 遍历所有数据实体 for data_entity in e.DataEntities: # 获取单据体 InStockEntry 数据 instock_entries = data_entity["InStockEntry"] # 如果是其他单据,请修改InStockEntry为表体的ORM实体名 # 遍历表体,检查物料编码字段 for entry in instock_entries: material_number = entry["MaterialId"]["Number"] # 获取物料编码 if material_number.startswith("4."): # 检查物料编码是否以 "4." 开头 # 如果找到符合条件的物料编码,则移除校验器 validators = list(filter(lambda x: x.GetType().Name == 'BillLinkValidator', e.Validators)) for validator in validators: e.Validators.Remove(validator) return # 找到符合条件的物料编码后即可退出函数
将上述脚本挂在采购入库单的保存操作插件中:
结果呈现:
如果物料编码至少有一行是1.开头,则可以保存:
如果物料编码都不是1.开头,则不允许保存:
推荐阅读