多组织即时库存规格型号及物料属性错误显示为主组织解决办法原创
金蝶云社区-丘丘爱学习
丘丘爱学习
0人赞赏了该文章 157次浏览 未经作者许可,禁止转载编辑于2022年12月29日 20:52:01

问题:多组织时,即时库存、即时库存明细查询时,规格型号以及基础资料属性都显示成主组织的。

原因:即时库存的数据表:[T_STK_INVENTORY]中,存储的物料id,是物料的masterid,也就是主组织的物料内码。所以最终物料的属性都是显示成主组织的。

解决办法:用列表插件,把相关字段的值重写。

代码实现:

c#

using Kingdee.BOS;

using Kingdee.BOS.App;

using Kingdee.BOS.Core.List.PlugIn.Args;

using Kingdee.BOS.Util;

using Kingdee.K3.SCM.Stock.Business.PlugIn;

using System.ComponentModel;

using System.Data;

using Kingdee.BOS.Orm.DataEntity;

using Kingdee.BOS.App.Data;

using System.Linq;


namespace LCNR.Kingdee.BOS.STK_InvSumQueryListEx

{

    [Description("即时库存列表插件"), HotUpdate]

    public class InvSumQueryListEx : InvSumQueryList

    {

        public override void FormatCellValue(FormatCellValueArgs args)

        {

            base.FormatCellValue(args);

            string sql;

            

            if (args.Header.FieldName.Equals("FModel"))

            {

                string org = args.DataRow["FSTOCKORGID"].ToString();

                //获取主组织下的物料masterid

                string masterid = args.DataRow["FMaterialId_Id"].ToString();

                //根据masterid查到多个组织的物料记录,再根据库存组织id,拿到正确的物料记录

                sql = string.Format(@"/*dialect*/select b.FSPECIFICATION from T_BD_MATERIAL a INNER JOIN T_BD_MATERIAL_L b ON a.FMATERIALID=b.FMATERIALID where a.FMASTERID={0} and a.FUSEORGID={1}", masterid, org);

                DynamicObject dyobj = DBUtils.ExecuteDynamicObject(this.Context, sql).First();

                //这个就是规格型号

                args.FormateValue = dyobj["FSPECIFICATION"];

            }

        }

    }

}


python:

import clr
clr.AddReference('System')
clr.AddReference('System.Data')
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.Core')
clr.AddReference('Kingdee.BOS.App')

from Kingdee.BOS import *
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.List import*
from Kingdee.BOS.Core.List.PlugIn import *
from System import *
from System.Data import *
from Kingdee.BOS.App.Data import *

def FormatCellValue(args):
    if (args.Header.FieldName=="FModel"):
         org = args.DataRow["FSTOCKORGID"].ToString();
         masterid = args.DataRow["FMaterialId_Id"].ToString();
        sql = "/*dialect*/select b.FSPECIFICATION from T_BD_MATERIAL a INNER JOIN T_BD_MATERIAL_L b ON a.FMATERIALID=b.FMATERIALID where a.FMASTERID={0} and a.FUSEORGID={1}".format(masterid, org);
         dyobj = DBUtils.ExecuteDynamicObject(this.Context, sql);
        args.FormateValue = dyobj[0]["FSPECIFICATION"];

插件注册后放在原有插件之前,不停用原有插件。


LCNR信息部 2022.12.29

赞 0