齐套分析子项明细自定义字段赋值处理指南

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

齐套分析子项明细自定义字段赋值处理指南

# 齐套分析子项明细自定义字段赋值处理指南 ## 需要提前了解的知识点 1.操作插件的开发(本文使用python操作插件作为案例,有编译条件的可以使用.net作为开发语言,一样的效果)注:本方案不适用于多租户部署 2.生产齐套分析单与齐套分析子项明细的元数据模型关系 3.如何添加物料属性引用 ## 本文案例 ### 我希望在生产齐套分析单的齐套分析子项明细携带二次开发的扩展字段。 #### 需要做的事情 1.齐套分析子项明细加入需要携带的目标字段 ![8.webp](/download/01009a2148df08054d4099ec534b16ecd286.webp) 2.扩展齐套分析单,于操作列表>保存操作>插件列表>注册Python插件加入二次开发插件,实现功能。有编译部署条件的朋友可以用.net实现,注册插件也是一样的。 ![9.webp](/download/01008a8894f70efb40448f231c551684ba2a.webp) #### 插件代码 ##### python版本 ```python #将本插件注册至生产齐套分析单保存操作,齐套分析单的分析功能在生成分析结果后,执行结束前会自动调用一次齐套分析单的保存 #通过保存注入该插件可以为二开的自定义字段作计算,赋值保存处理 import clr clr.AddReference('System.Core') clr.AddReference('Kingdee.BOS.ServiceHelper') clr.AddReference('Kingdee.BOS.DataEntity') from System.Linq import Enumerable from Kingdee.BOS.Util import ListUtils from Kingdee.BOS.Orm.DataEntity import DynamicObject from Kingdee.BOS.Core.SqlBuilder import QueryBuilderParemeter from Kingdee.BOS.ServiceHelper import MetaDataServiceHelper from Kingdee.BOS.ServiceHelper import BusinessDataServiceHelper def GetEntryKey(entry): return entry['MoEntryId'] def AfterExecuteOperationTransaction(e): dicMatchMoEntrys = Enumerable.ToDictionary(Enumerable.ToList(e.DataEntitys[0]['Entity']),GetEntryKey) #齐套分析单生产订单明细数据集合 fid = e.DataEntitys[0]['Id'] matchItemMeta = MetaDataServiceHelper.Load(this.Context,'PRD_MATCHDETAIL') qp = QueryBuilderParemeter() qp.FormId='PRD_MATCHDETAIL' qp.FilterClauseWihtKey = 'FID=%d' % (fid) qp.SelectItems = SelectorItemInfo.CreateItems('FENTRYID') matchItems = BusinessDataServiceHelper.Load(this.Context,matchItemMeta.BusinessInfo.GetDynamicObjectType(),qp) #抓取齐套分析单子项明细数据集合 if ListUtils.IsEmpty(matchItems):#空集则什么都不处理 return for matchItem in matchItems: if dicMatchMoEntrys.ContainsKey(matchItem['MoEntryId']): matchMoEntry = dicMatchMoEntrys[matchItem['MoEntryId']] #使用子项明细的MoEntryId匹配生产订单明细数据集合对应的订单分录 #实现子项明细的二次开发处理。获取字段的值使用对应字段的动态实体名 matchItemSubMtrl = matchItem['MaterialIdSub']#子项物料数据包,需要取物料字段先在齐套分析子项明细的物料编码字段加入引用属性 #获取物料字段要参考它所属的实体,如果字段的实体在子单据头上,需要先获取对应实体再取字段值 #以下提供几个获取物料字段的样例 mtrlBase = matchItemSubMtrl['MaterialBase'][0] #物料基本实体 erpclsId = mtrlBase['ErpClsId'] #物料属性 mtrlStock = matchItemSubMtrl['MaterialStock'][0]#物料库存实体 safeStock = mtrlStock['SafeStock']#物料库存页签的安全库存 specification = matchItemSubMtrl['Specification']#物料规格型号 #matchItem['MobillNo']= '%s|%d' % (matchMoEntry['MoBillNo'],matchMoEntry['MoEntrySeq'])#这是个样例,演示如何将生产订单明细的订单号+订单行号拼接填入子项明细的生产订单字段,二开逻辑可以在这里加入代码处理 BusinessDataServiceHelper.Save(this.Context,matchItems)#保存修改后的子项明细数据集合 ``` ##### C#版本 ```csharp using Kingdee.BOS; using Kingdee.BOS.Core.DynamicForm.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Core.Metadata; using Kingdee.BOS.Core.SqlBuilder; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.ServiceHelper; using Kingdee.BOS.Util; using Kingdee.K3.Core.MFG.EntityHelper; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SampleExtPlugIn { public class MatchBillSaveExtend : AbstractOperationServicePlugIn { public override void AfterExecuteOperationTransaction(AfterExecuteOperationTransaction e) { DynamicObject matchBillObject = e.DataEntitys[0]; var dicMatchMoEntrys = (matchBillObject["Entity"] as DynamicObjectCollection).GroupBy(x => x["MoEntryId"].ConvertTo<long>()).ToDictionary(x => x.Key, v => v.First());//齐套分析单生产订单明细数据集合 long fid = matchBillObject["Id"].ConvertTo<long>(0); FormMetadata matchItemMeta = MetaDataServiceHelper.Load(this.Context, "PRD_MATCHDETAIL") as FormMetadata; QueryBuilderParemeter qp = new QueryBuilderParemeter { FormId = "PRD_MATCHDETAIL", FilterClauseWihtKey = string.Format("FID={0}", fid), SelectItems = SelectorItemInfo.CreateItems("FENTRYID") }; //齐套分析单生产订单明细数据集合 DynamicObject[] matchItems = BusinessDataServiceHelper.Load(this.Context, matchItemMeta.BusinessInfo.GetDynamicObjectType(), qp); if (matchItems.IsEmpty()) { return; } foreach (var matchItem in matchItems) { DynamicObject matchMoEntry; if (dicMatchMoEntrys.TryGetValue(matchItem["MoEntryId"].ConvertTo<long>(), out matchMoEntry)) { //实现子项明细的二次开发处理。获取字段的值使用对应字段的动态实体名 var matchItemSubMtrl = matchItem["MaterialIdSub"] as DynamicObject;//子项物料数据包,需要取物料字段先在齐套分析子项明细的物料编码字段加入引用属性 //获取物料字段要参考它所属的实体,如果字段的实体在子单据头上,需要先获取对应实体再取字段值 //以下提供几个获取物料字段的样例 var mtrlBase = (matchItemSubMtrl["MaterialBase"] as DynamicObjectCollection)[0]; //物料基本实体 var erpclsId = mtrlBase["ErpClsId"].ConvertTo<string>(); //物料属性 var mtrlStock = (matchItemSubMtrl["MaterialStock"] as DynamicObjectCollection)[0];//物料库存实体 var safeStock = mtrlStock["SafeStock"].ConvertTo<decimal>();//物料库存页签的安全库存 LocaleValue specification = matchItemSubMtrl["Specification"] as LocaleValue;//物料规格型号 matchItem["MobillNo"] = string.Format("{0}|{1}", matchMoEntry["MoBillNo"], matchMoEntry["MoEntrySeq"]);//这是个样例,演示如何将生产订单明细的订单号+订单行号拼接填入子项明细的生产订单字段,二开逻辑可以在这里加入代码处理 } } BusinessDataServiceHelper.Save(this.Context, matchItems); } } } ``` #### 插件代码实现原理 通过在插件内获取齐套分析单的内码用于加载齐套分析子项明细数据集合,并在修改后调用一次保存。 如果需要到物料本身的属性,请在齐套分析子项明细的对应物料字段的【引用属性】列表添加需要的字段 ![10.webp](/download/01009e8e2346cb754dc4bd08cf2ac399ba43.webp) ## FAQ 齐套分析子项明细为什么在生产齐套分析单元数据上不可见? 答:因为齐套分析的数据范围比较大,输出的子项明细数据规模不可控,可能会达到上万到十几万的级别。上限太高,如果这部分数据附带在生产齐套分析单,作为一个单据体进行展示的渲染压力巨大,故子项明细被分离出去作为独立的列表进行展示,通过列表加载数据的机制优化界面渲染,而且可以提供性能更优的数据过滤功能。 问:缺料分析也想要做类似的二开应该怎么办? 答:缺料分析单的结构与生产齐套分析单类似,同类的二开场景可以参考本帖,把齐套分析子项明细业务对象和物理表换成缺料分析子项明细即可。

齐套分析子项明细自定义字段赋值处理指南

# 齐套分析子项明细自定义字段赋值处理指南## 需要提前了解的知识点1.操作插件的开发(本文使用python操作插件作为案例,有编译条件的可以...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息