插件新增物料

本帖最后由 sky王强 于 2018-09-05 18:14 编辑

需求背景:新建基础资料,保存时向物料表插入一条数据, 原物料单据已扩展出一个新的单据。 原因:Cloud 原有物料不能满足现有需求,故扩展(扩展后就加了表头2个字段,一个表体),想在后面财务结算时用物料来。

实现方式:表单纯插件代码新增物料, 保存后事件中实现物料表插入数据。参照的帖子:如何用插件实现增加物料
知识分享 – 如何使用纯插件创建物料并保存
报错:保存报未将对象引用到实例,是某个字段没给值? 调试时发现form.FormIdDynamicProperty = null,是这个原因吗?求解。

[Description("检测项目(物料)表单插件")] public class TestItem_BillPlug : AbstractBillPlugIn { /// <summary> /// 保存后事件: 检测项目保存后,向物料表插入数据 /// </summary> /// <param name="e"></param> public override void AfterSave(global::Kingdee.BOS.Core.Bill.PlugIn.Args.AfterSaveEventArgs e) { base.AfterSave(e); //this.StructureMaterial(); this.SaveMaterial_Info(); } private void SaveMaterial_Info() { #region 方法二: 创建视图、模型,模拟手工新增,会触发大部分的表单服务和插件 //获取销售出库单的元数据 FormMetadata meta = MetaDataServiceHelper.Load(this.Context, "BD_MATERIAL") as FormMetadata; //业务元数据BusinessInfo BusinessInfo info = meta.BusinessInfo; //获取表单服务 IResourceServiceProvider formServiceProvider = meta.BusinessInfo.GetForm().GetFormServiceProvider(true); IBillViewService billViewService = formServiceProvider.GetService(typeof(IDynamicFormView)) as IBillViewService; /******创建单据打开参数*************/ Form form = meta.BusinessInfo.GetForm(); BillOpenParameter billOpenParameter = new BillOpenParameter(form.Id, meta.GetLayoutInfo().Id); billOpenParameter = new BillOpenParameter(form.Id, string.Empty); billOpenParameter.Context = this.Context; billOpenParameter.ServiceName = form.FormServiceName; billOpenParameter.PageId = Guid.NewGuid().ToString(); billOpenParameter.FormMetaData = meta; billOpenParameter.LayoutId = meta.GetLayoutInfo().Id; billOpenParameter.Status = OperationStatus.ADDNEW; billOpenParameter.PkValue = null; billOpenParameter.CreateFrom = CreateFrom.Default; billOpenParameter.ParentId = 0; billOpenParameter.GroupId = ""; billOpenParameter.DefaultBillTypeId = null; billOpenParameter.DefaultBusinessFlowId = null; //设置参数,主业务组织修改时,不提示,直接创建新单 billOpenParameter.SetCustomParameter("ShowConfirmDialogWhenChangeOrg", false); List<AbstractDynamicFormPlugIn> value = form.CreateFormPlugIns(); billOpenParameter.SetCustomParameter(FormConst.PlugIns, value); //初始化视图 ((IDynamicFormViewService)billViewService).Initialize(billOpenParameter, formServiceProvider); //表单视图 IBillView bill_view = (IBillView)billViewService; //创建新的模型数据 bill_view.CreateNewModelData(); //主动触发插件的OnLoad事件 DynamicFormViewPlugInProxy proxy = bill_view.GetService<DynamicFormViewPlugInProxy>(); proxy.FireOnLoad(); //字段赋值 //基础资料字段赋值,用编码 // 填写物料各属性 this.FillMaterialPropertys(bill_view); //保存数据,获取操作结果 IOperationResult save_result = bill_view.Model.Save(); #endregion } /// <summary> /// 把物料的各属性,填写到IBillView当前所管理的物料中 /// </summary> /// <param name="billView"></param> private void FillMaterialPropertys(IBillView billView) { // 把billView转换为IDynamicFormViewService接口: // 调用IDynamicFormViewService.UpdateValue: 会执行字段的值更新事件 // 调用 dynamicFormView.SetItemValueByNumber :不会执行值更新事件,需要继续调用: // ((IDynamicFormView)dynamicFormView).InvokeFieldUpdateService(key, rowIndex); IDynamicFormViewService dynamicFormView = billView as IDynamicFormViewService; /********************物料页签上的字段******************/ // 创建组织、使用组织 : // 基础资料字段,用编码录入 (SetItemValueByNumber) // 特别说明:基础资料字段,也可以使用SetValue函数赋值,填写基础资料内码 // 本示例,模拟引入数据,并不清楚这些组织的内码是多少,只知道编码,所以选用SetItemValueByNumber // 函数参数 : 基础资料字段Key,组织编码,行号 //101.1 dynamicFormView.SetItemValueByNumber("FUseOrgId", "1", 0); dynamicFormView.SetItemValueByNumber("FCreateOrgId", "1", 0); // 物料编码、名称 : // 文本(简单值类型),直接使用SetValue赋值 dynamicFormView.UpdateValue("FNumber", 0, "物料编码(JD-001)"); dynamicFormView.UpdateValue("FName", 0, "物料名称(JD-001)"); // 规格型号 (文本) dynamicFormView.UpdateValue("FSpecification", 0, "规格型号(JD-001)"); // 助记码 (文本) dynamicFormView.UpdateValue("FMnemonicCode", 0, "助记码(JD-001)"); // 描述 (文本) dynamicFormView.UpdateValue("FDescription", 0, "描述(JD-001)"); // 来源 (下拉列表):填写枚举值 dynamicFormView.UpdateValue("FMaterialSRC", 0, "B"); // 创建人、创建日期、修改人、修改日期、审核人、审核日期、 // 禁用人、禁用日期、禁用状态、数据状态等由系统自动赋值 /********************基本页签上的字段******************/ // 条码 (文本) dynamicFormView.UpdateValue("FBARCODE", 0, "TiaoMa(JD-001)"); // 物料属性(下拉列表,’1′ = 外购,’2′ = 自制…) dynamicFormView.UpdateValue("FErpClsID", 0, "2"); // ======================================= 存货类别(基础资料,按编码赋值 ‘CHLB06_SYS’ = 服务类)=============================================== dynamicFormView.SetItemValueByNumber("FCategoryID", "CHLB06_SYS", 0); // 税分类(单选辅助资料-物料的税分类,赋值同基础资料赋值 ‘WLDSFL01_SYS’ = 标准税率) dynamicFormView.SetItemValueByNumber("FTaxType", "WLDSFL01_SYS", 0); // 允许采购(复选框,简单值类型,值填写truefalse) dynamicFormView.UpdateValue("FIsPurchase", 0, true); // 基本单位(基础资料):非常重要的字段,必须慎重设置 // 基本单位仅能选择基准计量单位,如kg, m, pcs dynamicFormView.SetItemValueByNumber("FBaseUnitId", "kg", 0); // 允许库存、允许委外、即时核算、允许销售、允许生产、 // 允许资产等字段同允许采购字段,已有默认值,无需设置 // 默认税率已有默认值,无需设置 // 物料分类(FTypeID,维度关联字段,赋值比较特别,需要针对各仓位维度赋值) // 如果没有定义仓位维度,则无需赋值 // 另外,需要根据仓位维度的值类型,选用适当的赋值函数 // dynamicFormView.SetItemValueByNumber("$FTypeID__FF100001", "仓位维度1的编码(JD-001)", 0); // 重量单位,默认为kg; // 长度单位,默认为m; // 毛重(数量,简单值类型,直接填写数值) dynamicFormView.UpdateValue("FGROSSWEIGHT", 0, 0); // 净重、长、宽、高、体积,非重要属性,忽略 /********************其他页签上的字段****************************/ // 演示代码,仅设置必录字段 // 库存单位(基础资料) ((IDynamicFormViewService)billView).SetItemValueByNumber("FStoreUnitID", "kg", 0); dynamicFormView.SetItemValueByNumber("FStoreUnitID", "kg", 0); // 辅助单位 dynamicFormView.SetItemValueByNumber("FAuxUnitID", "Pcs", 0); // 销售单位 dynamicFormView.SetItemValueByNumber("FSaleUnitId", "kg", 0); // 销售计价单位 dynamicFormView.SetItemValueByNumber("FSalePriceUnitId", "kg", 0); // 采购单位 dynamicFormView.SetItemValueByNumber("FPurchaseUnitId", "kg", 0); // 采购计价单位 dynamicFormView.SetItemValueByNumber("FPurchasePriceUnitId", "kg", 0); // 换算方向(下拉列表, ‘1’ = 库存单位 -> 辅助单位) dynamicFormView.UpdateValue("FUnitConvertDir", 0, "1"); // 配额方式、计划策略、订货策略、 // 固定提前期单位、变动提前期单位、检验提前期单位、订货间隔期单位、 // 预留类型、时间单位、发料方式、超发控制方式 // 上述字段为下拉列表,必录字段,但已经设置了默认值,演示代码忽略 // 其他非必录字段均采用默认值 // 推荐: // 可以在BOS设计器,打开物料,查看需要填写的字段类型,按照类型填字段值 /********************库存属性单据体字段******************/ // 需确定本物料,是否区分如下各库存维度: // 仓库、仓位、BOM版本、批号、计划跟踪号; // 默认情况下,仅区分仓库维度,仓位等不区分 for (int rowIndex = 0; rowIndex < billView.Model.GetEntryRowCount("FEntityInvPty"); rowIndex++) { // 库存属性,基础资料类型: // 读取出当前库存属性信息,以便判断本物料是否启用此维度 DynamicObject invPty = billView.Model.GetValue("FInvPtyId", rowIndex) as DynamicObject; if (invPty == null) continue; // 读出库存属性编码备用(库存属性的编码 = T_BD_INVPROPERTY.FNumber) string invPtyNumber = Convert.ToString(invPty["number"]); // 演示代码,增加仓位维度(number = ’02’) if (invPtyNumber.ToUpper().Equals("02")) { // 库存属性 – 启用(复选框) dynamicFormView.UpdateValue("FIsEnable", rowIndex, true); // 是否影响价格等选项,采用默认值 } } /********************辅助属性单据体字段******************/ // 需逐行判断本物料是否启用各辅助属性 for (int rowIndex = 0; rowIndex < billView.Model.GetEntryRowCount("FEntityAuxPty"); rowIndex++) { // 辅助属性、基础资料类型: // 读取出当前辅助属性信息,以便判断本物料是否启用 DynamicObject auxProp = billView.Model.GetValue("FAuxPropertyId", rowIndex) as DynamicObject; if (auxProp == null) continue; // 读出辅助属性编码备用。 string auxPropNumber = Convert.ToString(auxProp["number"]); // 判断此辅助属性是否启用(辅助属性编码 = T_BD_FLEXAUXPROPERTY.FNumber) // 演示代码,仅启用辅助属性 – 等级(Class) if (auxPropNumber.ToUpper().Equals("CLASS")) { // 辅助属性是否启用(复选框) dynamicFormView.UpdateValue("FIsEnable1", rowIndex, true); // 是否影响价格等选项,采用默认值 } } // 扩展的字段: //检测项目 分类 string strType = this.GetBaseDataByKey("FC_Type", "Id", 0); dynamicFormView.UpdateValue("FC_IndustryID", 0, strType); //是否组合 FC_IsCombination object objCombin = this.Model.GetValue("FC_IsCombination"); if (objCombin != null) { bool isCombin = Convert.ToBoolean(objCombin); dynamicFormView.UpdateValue("FC_IsCombination", 0, isCombin); } } /// <summary> /// 获取基础资料数据属性 /// </summary> /// <param name="Filterkey">字段标识</param> /// <param name="sKey">属性标识 如:Id Name Number(基础数据的) FDataValue(辅助属性的)</param> /// <param name="Row">0 为单据头字段,1…n开始为分录字段</param> /// <returns></returns> public string GetBaseDataByKey(string strFilterKey, string sKey, int rowNumber) { string strReturnValue = ""; DynamicObject doFilter = this.Model.GetValue(strFilterKey, rowNumber) as DynamicObject; if (doFilter != null) { strReturnValue = Convert.ToString(doFilter[sKey]); } return strReturnValue; }}复制代码

 

问题名称:插件新增物料

点击链接查看答案:

https://club.kingdee.com/forum.php?mod=viewthread&tid=1396909

未经允许不得转载:友商问答 » 插件新增物料

赞 (0)