去年在客户现场,基础资料的 物料 需要在审核点击后时,根据物料属性的赋值,修改另一个字段的解决,被要求用PYTHON来写。物料属性 的枚举类容如下
我新增了一个字段,如下图
查了下数据库,这个字段 F_LDQ_SXJG是在物料主表处T_BD_MATERIAL, 然后用Python写,代码截图如下、
文字版如下
----------------
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"
----------------
在写代码的过程中,首先报错如下
这是因为 没有 预先加载字段(个人术语)编写OnPreparePropertys(e):。
然后又发现了对象的类型问题,错误如下
这个说话,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个半小时的老师。
推荐阅读