【Python】采购入库单有条件的校验分录行必须关联生成原创
金蝶云社区-戴同学
戴同学
99人赞赏了该文章 424次浏览 未经作者许可,禁止转载编辑于2024年05月19日 19:53:22

需求背景:

单据类型的选项勾选所有分录行关联生成后,则单据保存的时候,就会无条件校验该单据类型任何场景的所有分录行都必须关联生成,也就是必须要有源单。但有些时候可能需要排除特定物料,例如采购入库单希望如果物料编码为1开头,就可以直接保存,而无需从采购订单下推。

image.png


解决方法:

本质上这个保存校验的校验器名称是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  # 找到符合条件的物料编码后即可退出函数


将上述脚本挂在采购入库单的保存操作插件中:

image.png


结果呈现:

如果物料编码至少有一行是1.开头,则可以保存:

image.png


如果物料编码都不是1.开头,则不允许保存:

image.png


赞 99