Python校验销售订单的BOM不是供应组织下的BOM

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

Python校验销售订单的BOM不是供应组织下的BOM

【问题描述】

    当物料清单被分配到多个组织后,销售订单分录上的'BOM版本'字段默认是会使用供应组织下的BOM(插件会控制当供应组织修改时,自动切换Bom版本ID)。但在某些情况下客户账套数据可能存在BOM版本不是供应组织下的BOM,如下图1-1所示:

图1-1


    从数据库中查询可以发现,T_SAL_ORDERENTRY 表中的FBOMID字段的值是其它组织下的BOMID,如图1-2所示:

图1-2


    这种异常数据在走销售流程时其实影响不大,因为到了发货通知或者销售出库单时,下游单据上的BOM版本字段是会自动根据使用组织正确切换,因此即使在销售订单上有异常,客户一般也不容易发现,但是当在销售订单上使用制造领域的预留功能时就可能会报错,如下图1-3所示:

图1-3


【解决方案】

    如果遇到上图1-3的预留问题,可通过一个Python案例来校验当BOM字段有异常数据时,拦截住不让保存,首先扩展销售订单,在保存操作上添加如下图2-1所示的Python插件:

图2-1


    Python代码如下所示(注意复制此脚本可能存在空格转义问题导致Python失败,建议复制代码后手工清空空格及换行然后再再输入空格及换行或者使用附件中的文本KingdeeSaleOrderSave.zip


# -*- coding: utf-8 -*-

#校验2023年前销售订单BOM不是供应组织下的问题


import clr

clr.AddReference('System')

clr.AddReference('System.Data')

clr.AddReference('Kingdee.BOS')

clr.AddReference('Kingdee.BOS.Core')

clr.AddReference('Kingdee.BOS.App')


from System import *

from System.Collections.Generic import *

from Kingdee.BOS.Core.DynamicForm.PlugIn.Args import *

from Kingdee.BOS.App.Data import *

from System.Data import *


def BeginOperationTransaction(e):

    if e.DataEntitys is not None and e.DataEntitys.Length > 0:

        listItems = {};

        bomIds = [];

        orgIds = [];

        for billData in e.DataEntitys:

            entryDatas = billData["SaleOrderEntry"];

            if entryDatas is not None and entryDatas.Count > 0:

               for entryData in entryDatas:            

                   orgIds.append(Convert.ToString(entryData["SupplyOrgId_Id"]));             

                   bomIds.append(Convert.ToString(entryData["BomId_Id"]));           

                   listItems[Convert.ToString(entryData["BomId_Id"])] = Convert.ToString(entryData["SupplyOrgId_Id"]);

        stringifyBomIds = ",".join(bomIds)

        dataReader = DBUtils.ExecuteReader(this.Context, "SELECT FID, FUSEORGID FROM T_ENG_BOM WHERE FID IN (" + stringifyBomIds + ")");

        try:

            while dataReader.Read():

                useOrgId = Convert.ToString(dataReader["FUSEORGID"]);

                bomIdInDatabase = Convert.ToString(dataReader["FID"]);                

                if not listItems.get(bomIdInDatabase) != useOrgId:

                    e.CancelOperation = True;

                    raise Exception("存在BOM与供应组织不匹配的记录,请检查做单流程并通知金蝶研发分析。BOM:" + bomIdInDatabase);

        finally:

            dataReader.Dispose();


当保存销售订单有异常数据时会有下图2-2的提示:

图2-2



Python校验销售订单的BOM不是供应组织下的BOM

【问题描述】 当物料清单被分配到多个组织后,销售订单分录上的'BOM版本'字段默认是会使用供应组织下的BOM(插件会控制当供应组...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息