Python插件 - 记录一下【双明细表】单据转换干预目标单据明细表数据,多单据体转换
# 需求
## 产品问题表
![image.webp](/download/010029798048a21f4c5282175773e86bd7ca.webp)
![image.webp](/download/0100f8f9019539ac42158a4772cd6acf274a.webp)
## 产品问题明细表
![image.webp](/download/01002d12e0c967234afbb6d44c2018a9114f.webp)
根据产品问题表 **下推** 产品问题明细表
产品问题表按照**【部门】**分组下推
![image.webp](/download/010060f9c14e1f5045f7a592ffa25478859a.webp)
**【部门】**数据在一个单据体,物料数据在一个单据体,通过单据转换配置**多单据体**就会出现这个问题
![image.webp](/download/0100f166043509b04c68856e2d3a0887e73f.webp)
# 单据转换插件
用到了2个函数
OnGetSourceData **获取源单数据后事件**
AfterConvert **单据转换之后事件**
开发的思路是,从 OnGetSourceData 获取源单标识,在 AfterConvert 单据转换之后获取源单数据对目标数据包新建插入
## 源码
``` python
#作者: 老李头
import clr
clr.AddReference("System")
clr.AddReference("System.Core")
clr.AddReference("Kingdee.BOS")
clr.AddReference("Kingdee.BOS.Core")
clr.AddReference("Kingdee.BOS.Contracts")
clr.AddReference("Kingdee.BOS.App")
clr.AddReference("Kingdee.BOS.DataEntity")
clr.AddReference("Kingdee.BOS.ServiceHelper")
#clr.AddReference("Newtonsoft.Json")
from Kingdee.BOS.Core.Metadata import *
from Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn import *
from Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args import *
from Kingdee.BOS.Orm.DataEntity import *
from Kingdee.BOS.Orm.Metadata.DataEntity import *
from Kingdee.BOS.Core.Metadata.FormElement import *
from Kingdee.BOS.Core.SqlBuilder import *
from Kingdee.BOS.ServiceHelper import *
from Kingdee.BOS.Util import *
from System import *
from System.Collections.Generic import *
from System.ComponentModel import *
#from Newtonsoft.Json import *
#from Newtonsoft.Json.Linq import *
global _sourceFormId;
_sourceFormId = "SMTO_s1"; #源单表单ID唯一标识【产品问题表】
global _sourceData;
global _fid
_fid = 0;
def OnGetSourceData(e):
global _fid
for data in e.SourceData:
_fid = Convert.ToInt64(data["FID"]); #获取源单的内码 用于转换后查询源单数据
#单据转换之后事件
def AfterConvert(e):
#得到目标单据数据包扩展集合
dataObjs = e.Result.FindByEntityKey("FBillHead");
#获取源单数据 开始
metadata = MetaDataServiceHelper.Load(this.Context, _sourceFormId);
para = QueryBuilderParemeter();
para.BusinessInfo = metadata.BusinessInfo;
para.FormId = _sourceFormId;
para.FilterClauseWihtKey = " FID = {0} ".format(_fid);
soDatas = BusinessDataServiceHelper.Load(this.Context, metadata.BusinessInfo.GetDynamicObjectType(),para);
#获取源单数据 结束
if soDatas is not None and soDatas.Count > 0:
for obj in dataObjs:
entryDyType = e.TargetBusinessInfo.GetEntity("FEntity").DynamicObjectType;#目标单据明细表类型
cusEntrys = obj["FEntity"]#明细表的【绑定属性实体】
if cusEntrys is None:
cusEntrys = DynamicObjectCollection(entryDyType, obj);
#raise NameError(JsonConvert.SerializeObject(obj));
#循环源单
for item in soDatas:
cusEntry = item["FEntity"];#源单数据 明细表的【绑定属性实体】
for items in cusEntry:
#raise NameError(JsonConvert.SerializeObject(items));
dy = DynamicObject(entryDyType);
#序号
dy["seq"] = items["seq"];
#基础资料,辅助资料 都为对象(需要赋值字段的【绑定实体属性】和【绑定实体属性_Id】)2个
#物料编码
dy["SMTO_Base2"] = items["F_SMTO_Base1"];
dy["SMTO_Base2_Id"] = items["F_SMTO_Base1_Id"];
cusEntrys.Add(dy);
else:
raise NameError("转换插件 - 源单数据获取失败");
```
# 插件部署
![image.webp](/download/010060defc85209a49aa809c36f686b53755.webp)
# 实现效果
![output.webp](/download/0100cf23fff0ce4c43e38b4be6ab07022191.webp)
Python插件 - 记录一下【双明细表】单据转换干预目标单据明细表数据,多单据体转换
# 需求## 产品问题表![image.webp](/download/010029798048a21f4c5282175773e86bd7ca.webp)![image.webp](/download/0100f8f9019539ac421...
点击下载文档
本文2024-09-16 17:13:23发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-14322.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章