表单插件开发——加载单据体物料的父件编码信息原创
金蝶云社区-依然如昨
依然如昨
3人赞赏了该文章 68次浏览 未经作者许可,禁止转载编辑于2024年04月24日 08:44:07
封面

1、用户需求:要求采购申请单填写物料后,显示父件物料的编码、规格、名称信息。

2、解决方案:

(1)BOS里查看单据明细行上有“父件产品”,但是做单时并没有显示什么数据;

(2)字段值更新可用的现有服务里也没有直接获取父件物料信息的服务;

(3)只好做二次开发,用表单插件解决;

(4)在单据体自定义基础资料(物料编码)、基础资料属性(规格、名称)共3个字段;

(5)二次开发表单插件,在DataChanged(值更新)事件中去数据库获取到父件信息然后赋值给自定义的父件物料字段。

注意:DataChanged是针对单据上所有的字段,所以要判断一下本次更新的是不是目标字段。具体编码如下:

using Kingdee.BOS.Core.DynamicForm.PlugIn;

using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;

using Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel;

using Kingdee.BOS.Util;

using Kingdee.BOS.App.Data;

using System;

using System.ComponentModel;

using Kingdee.BOS.Orm.DataEntity;

using Kingdee.BOS.Core.Metadata.FieldElement;

using System.Linq;

using Kingdee.BOS.Core.Metadata.EntityElement;

namespace VMKR.K3CLOUD.SCM.PUR.APPLY.Plugin

{

    /// <summary>

    /// 【表单插件】按钮

    /// </summary>

    [Description("【表单插件】获取物料父件信息"), HotUpdate]

    public class ApplyPlugin : AbstractDynamicFormPlugIn 

    {

        /// <summary>

        /// 物料编码值更新事件

        /// </summary>

        /// <param name="e"></param>

        public override void DataChanged(DataChangedEventArgs e)

        {

            base.DataChanged(e);

            if (e.Field.Key.Equals( "FMaterialId",StringComparison.OrdinalIgnoreCase))

            {

                string strSql = @"/*dialect*/SELECT TBOM.FNUMBER BomVersion,FXWL.FNUMBER ,FXWL_L.FNAME  ,FXWL_L.FSPECIFICATION,FXWL.FMATERIALID

                FROM DBO.T_ENG_BOM T1

                INNER JOIN (SELECT MAX(FNUMBER ) FNUMBER, FMATERIALID FROM T_ENG_BOM GROUP BY  FMATERIALID) TBOM ON TBOM.FMATERIALID=T1.FMATERIALID --and t1.FNUMBER=tbom.FNUMBER

                INNER JOIN T_BD_MATERIAL FXWL ON FXWL.FMATERIALID = T1.FMATERIALID and t1.FFORBIDSTATUS = 'A' --只取未禁用状态的BOM

                INNER JOIN T_BD_MATERIAL_L FXWL_L ON FXWL.FMATERIALID = FXWL_L.FMATERIALID and FXWL_L.FLOCALEID =2052

                INNER JOIN T_ENG_BOMCHILD T3 ON T1.FID = T3.FID

                INNER JOIN T_BD_MATERIAL ZXWL ON ZXWL.FMATERIALID = T3.FMATERIALID

                WHERE ZXWL.FMATERIALID=" + e.NewValue.ToString(); 

                DynamicObjectCollection dc = DBUtils.ExecuteDynamicObject(this.Context, strSql);                

                if (dc.Count() > 0)

                {

                    BaseDataField bdf = e.Field as BaseDataField;

                    DynamicObject materialObj = Kingdee.BOS.ServiceHelper.BusinessDataServiceHelper.LoadSingle(this.Context, dc[0]["FMATERIALID"], bdf.RefFormDynamicObjectType);

                    string entityKey = "FEntity";//单据体标识,非实体

                    Entity entity = this.View.BillBusinessInfo.GetEntity(entityKey);

                    DynamicObjectCollection rows = this.View.Model.GetEntityDataObject(entity);

                    //this.View.ShowMessage("此物料父件为:"+dc[0]["FSPECIFICATION"].ToString()+ dc[0]["FNAME"].ToString());

                    //DynamicObject m = rows[e.Row]["F_VMKR_FJBM"] as DynamicObject;                    

                    rows[e.Row]["F_VMKR_FJBM"] = materialObj;//e.row非行实体,只是行index;只能获取整个单据体,通过index定位到行实体

                    this.View.UpdateView(entityKey);

                }

            }

        }

}


赞 3