如何通过插件携带第二个单据体到下游单据
生活随笔
收集整理的這篇文章主要介紹了
如何通过插件携带第二个单据体到下游单据
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
背景說明:
K/3 Cloud 不支持在下推時,同時攜帶兩個單據體的數據;
因此,需要在轉換規則上,配置好攜帶主單據體;
而輔助單據體的數據,需要在插件中自行攜帶;
案例說明:
本案例,設計了兩張單據A和B,都有兩個單據體,主單據體為FEntity,第二單據體為FEntity2;
主單據體的字段,已經配置的單據轉換規則 - 字段映射關系;
而第二單據體,需要通過插件攜帶;
第二單據體僅有一個文本字段F_JD_Text;
特別說明:
本案例不適用于同一張源單同時下推為多張目標單的情況:
這樣情況是分單了,而第二單據體,無法對應拆分;
K/3 Cloud 不支持在下推時,同時攜帶兩個單據體的數據;
因此,需要在轉換規則上,配置好攜帶主單據體;
而輔助單據體的數據,需要在插件中自行攜帶;
案例說明:
本案例,設計了兩張單據A和B,都有兩個單據體,主單據體為FEntity,第二單據體為FEntity2;
主單據體的字段,已經配置的單據轉換規則 - 字段映射關系;
而第二單據體,需要通過插件攜帶;
第二單據體僅有一個文本字段F_JD_Text;
特別說明:
本案例不適用于同一張源單同時下推為多張目標單的情況:
這樣情況是分單了,而第二單據體,無法對應拆分;
示例代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel;using Kingdee.BOS; using Kingdee.BOS.Util; using Kingdee.BOS.Core; using Kingdee.BOS.Core.Metadata; using Kingdee.BOS.Core.Metadata.ConvertElement; using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn; using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args; using Kingdee.BOS.Core.Metadata.EntityElement; using Kingdee.BOS.Core.Metadata.FormElement; using Kingdee.BOS.Core.SqlBuilder; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.Contracts; using Kingdee.BOS.App;namespace JDSample.ServicePlugIn.BillConvert {/// <summary>/// 攜帶其他單據體/// </summary>[Description("攜帶其他單據體")]public class S151105TakeOtherEntryConvPlug : AbstractConvertPlugIn{/// <summary>/// 主單據體的字段攜帶完畢,與源單的關聯關系創建好之后,觸發此事件/// </summary>/// <param name="e"></param>public override void OnAfterCreateLink(CreateLinkEventArgs e){// 預先獲取一些必要的元數據,后續代碼要用到:// 源單第二單據體Entity srcSecondEntity = e.SourceBusinessInfo.GetEntity("FEntity2");// 目標單第一單據體Entity mainEntity = e.TargetBusinessInfo.GetEntity("FEntity");// 目標單第二單據體Entity secondEntity = e.TargetBusinessInfo.GetEntity("FEntity2");// 目標單關聯子單據體Entity linkEntity = null;Form form = e.TargetBusinessInfo.GetForm();if (form.LinkSet != null && form.LinkSet.LinkEntitys != null&& form.LinkSet.LinkEntitys.Count != 0){linkEntity = e.TargetBusinessInfo.GetEntity(form.LinkSet.LinkEntitys[0].Key);}if (linkEntity == null){return;}// 獲取生成的全部下游單據ExtendedDataEntity[] billDataEntitys = e.TargetExtendedDataEntities.FindByEntityKey("FBillHead");// 對下游單據,逐張單據進行處理foreach (var item in billDataEntitys){DynamicObject dataObject = item.DataEntity;// 定義一個集合,用于收集本單對應的源單內碼HashSet<long> srcBillIds = new HashSet<long>();// 開始到主單據體中,讀取關聯的源單內碼DynamicObjectCollection mainEntryRows = mainEntity.DynamicProperty.GetValue(dataObject) as DynamicObjectCollection;foreach (var mainEntityRow in mainEntryRows){DynamicObjectCollection linkRows = linkEntity.DynamicProperty.GetValue(mainEntityRow) as DynamicObjectCollection;foreach (var linkRow in linkRows){long srcBillId = Convert.ToInt64(linkRow["SBillId"]);if (srcBillId != 0&& srcBillIds.Contains(srcBillId) == false){srcBillIds.Add(srcBillId);}}}if (srcBillIds.Count == 0){continue;}// 開始加載源單第二單據體上的字段// 確定需要加載的源單字段(僅加載需要攜帶的字段)List<SelectorItemInfo> selector = new List<SelectorItemInfo>();selector.Add(new SelectorItemInfo("F_JD_Text"));// TODO: 繼續添加其他需要攜帶的字段,示例代碼略// 設置過濾條件string filter = string.Format(" {0} IN ({1}) ",e.SourceBusinessInfo.GetForm().PkFieldName,string.Join(",", srcBillIds));OQLFilter filterObj = OQLFilter.CreateHeadEntityFilter(filter);// 讀取源單IViewService viewService = ServiceHelper.GetService<IViewService>();var srcBillObjs = viewService.Load(this.Context,e.SourceBusinessInfo.GetForm().Id,selector,filterObj);// 開始把源單單據體數據,填寫到目標單上DynamicObjectCollection secondEntryRows = secondEntity.DynamicProperty.GetValue(dataObject) as DynamicObjectCollection;secondEntryRows.Clear(); // 刪除空行foreach (var srcBillObj in srcBillObjs){DynamicObjectCollection srcEntryRows = srcSecondEntity.DynamicProperty.GetValue(srcBillObj) as DynamicObjectCollection;foreach (var srcEntryRow in srcEntryRows){// 目標單添加新行,并接受源單字段值DynamicObject newRow = new DynamicObject(secondEntity.DynamicObjectType);secondEntryRows.Add(newRow);// 填寫字段值newRow["F_JD_Text"] = srcEntryRow["F_JD_Text"];// TODO: 逐個填寫其他字段值,示例代碼略}}}}} }
轉載于:https://www.cnblogs.com/fyq891014/p/8698053.html
總結
以上是生活随笔為你收集整理的如何通过插件携带第二个单据体到下游单据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内部文件存储
- 下一篇: Web服务器安全设置