Python 写审核是根据字段A修改字段B的值原创
金蝶云社区-山抹微云
山抹微云
13人赞赏了该文章 1,480次浏览 未经作者许可,禁止转载编辑于2021年09月28日 18:06:17

  去年在客户现场,基础资料的 物料 需要在审核点击后时,根据物料属性的赋值,修改另一个字段的解决,被要求用PYTHON来写。物料属性 的枚举类容如下

 image.png

  我新增了一个字段,如下图

   image.png

 查了下数据库,这个字段 F_LDQ_SXJG是在物料主表处T_BD_MATERIAL, 然后用Python写,代码截图如下、

image.png

文字版如下

 ----------------

clr.AddReference('System')

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

from Kingdee.BOS.Core.Bill.PlugIn import *

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

from Kingdee.BOS.Core.Metadata.EntityElement import *

from System import *

from Kingdee.BOS.Core.DynamicForm.PlugIn import AbstractOperationServicePlugIn 


def OnPreparePropertys(e):

    e.FieldKeys.Add("FErpClsID")

    e.FieldKeys.Add("F_LDQ_SXJG")


def BeginOperationTransaction(e):

    for Data in e.DataEntitys:

        MaterialBase_Collection = Data["MaterialBase"]

        MaterialBase = MaterialBase_Collection[0]

        FErpClsID =  str(MaterialBase["ErpClsID"])

         if  FErpClsID  in [  "1","2","3","4","5"] :

         Data["F_Ldq_Text"] =  "Small"

         else:

         Data["F_Ldq_Text"] =  "Big" 

 ----------------

在写代码的过程中,首先报错如下      

image.png

这是因为 没有 预先加载字段(个人术语)编写OnPreparePropertys(e):。

然后又发现了对象的类型问题,错误如下   

image.png

这个说话,Python每个操作步骤其产生的类,跟C#变成的是一样的。

为了大家便于体会, 同时附上C#版本的代码如下

 ----------------

        public override void OnAddValidators(AddValidatorsEventArgs e)

        {

            var operValidator = new OperValidator();

            operValidator.AlwaysValidate = true;

            operValidator.EntityKey = "FBillHead";

            e.Validators.Add(operValidator);

        }


        public override void BeginOperationTransaction(BeginOperationTransactionArgs e)

        {

            foreach (DynamicObject Data in e.DataEntitys)

            {

                Kingdee.BOS.Orm.DataEntity.DynamicObjectCollection MaterialBase_Collection = Data["MaterialBase"] as Kingdee.BOS.Orm.DataEntity.DynamicObjectCollection;

                Kingdee.BOS.Orm.DataEntity.DynamicObject MaterialBase = MaterialBase_Collection[0];

                string ErpClsID = Convert.ToString(MaterialBase["ErpClsID"]);

                List<string> Smalls = new List<string> { "1", "2", "3", "4", "5" };

                foreach (string Small in Smalls)

                {

                    if (Small == ErpClsID)

                    {

                        Data["F_Ldq_Text"] = "Small";

                        break; 

                    }

                    else Data["F_Ldq_Text"] = "Big";

                }

            }

        }

 ----------------

  感谢我团队里的小伙伴们,特别是那时候与我探索这个问题语音了1个半小时的老师。

赞 13