[二开]PLM物料库列表单击,显示物料信息/反查等动态表单(子窗体引发父窗体事件)原创
金蝶云社区-云社区用户E11u1291
云社区用户E11u1291
10人赞赏了该文章 37次浏览 未经作者许可,禁止转载编辑于2024年09月14日 11:35:26
summary-icon摘要由AI智能服务提供

这段文本描述了一个在客户端环境下进行软件开发的过程和遇到的问题解决方案。文本中提到,开发环境是v8.1 6月补丁版本,由于只在客户端工作,所有代码调试都针对客户端进行。开发团队在尝试使用CustomEvent方式实现某些功能时遇到困难,最终采用简单的传值方式解决了问题。具体实现效果是在不打开物料或BOM的情况下,能够进行反查等功能的操作。 在BOS配置中,资源库被设计为一个动态表单,该表单内嵌了公共平台树和一个面板,用于加载物料库列表。为了将物料库列表的数据传递给父窗体,开发团队在页签下添加了一个文本字段“F_PJQF_ROWID”,用于存储并传递列表rowid(即物料id)。 关键代码部分展示了如何在物料库列表中点击行时,获取行数据并传递给父窗体的实现逻辑。同时,也介绍了在资源库动态表单插件中,当F_PJQF_ROWID字段数据变化时,如何执行相应的逻辑来加载不同的字段或面板。整个实现过程包括了对非首次点击事件的判断、数据传递的实现、以及根据数据变化来动态加载内容的逻辑。 文本中还展示了资源库动态表单插件的部分代码,这些代码主要涉及到插件的初始化、页签切换时的数据处理,以及数据变化时的逻辑处理等功能。通过这些代码,可以看到整个插件如何与BOS框架集成,并实现具体的业务逻辑。

环境:v8.1 6月补丁,客户端条件下(网页端部分代码会有问题,因为我们只用客户端,所以代码都是针对客户端调试的)

论坛里搜索过CustomEvent方式实现,但是调试不好,最后用简单粗暴的传值方式解决了

效果:不用打开这个物料或bom就能进行反查等相关功能

image.png

实现,BOS配置:

资源库是一个动态表单,内嵌了左边的公共平台树,和一个面板,加载物料库列表.相当于物料库列表窗体的父窗体是资源库

除下图的相关,为了方便,在页签下面放了一个文本字段"F_PJQF_ROWID",作为列表传递给父项的值,其值=列表rowid,也是物料id

上传图片

关键代码: 非专业开发人员,代码比较烂,凑付着看吧

1 物料库列表:因为一开始打开列表的时候也会进入行单击事件,所以做了个判断,首次不触发

  public override void EntityRowClick(EntityRowClickEventArgs e)
        {
            base.EntityRowClick(e);
            
            if (djflag)
            {
                ListSelectedRowCollection rowsColObj = this.ListView.SelectedRowsInfo;
                if (rowsColObj.Count > 0)
                {
                    var rowObj = rowsColObj[0].DataRow;
                      wlid = rowObj["fid"].GetString();
                    this.View.ParentFormView.Model.SetValue("F_PJQF_ROWID",wlid, -1);

                    this.View.SendDynamicFormAction(this.View.ParentFormView);//关键是这句才能传递给父窗体 
                }
            }

            if (djflag == false)
            {
                djflag = true;
            } 
        }

2 资源库动态表单插件:

列表点击后,执行了SendDynamicFormAction 后, 资源库列表插件就会执行F_PJQF_ROWID字段的DataChanged


  public override void DataChanged(DataChangedEventArgs e)
        {
            base.DataChanged(e);
            if (e.Field.Key == "F_PJQF_ROWID")
            {
                wlid = e.NewValue.GetString();

                YeQianload(); 
            }
        }

然后,后面的逻辑就是加载字段或相应页签的面板了

资源库列表插件部分代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Core.SqlBuilder;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Core.Metadata;
using System.ComponentModel;
using System.Threading;
using Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.Bill;
using Kingdee.BOS.Util;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Core.Metadata.EntityElement;

namespace QF.K3.MPM.BusinessPlugIn.PLM
{
    [Kingdee.BOS.Util.HotUpdate]
    [Description("PLM资源库动态表单插件")]
    public class PLMZYKEdit : AbstractDynamicFormPlugIn
    {
         
        string tree = "";
        string currentYeQian= "F_PJQF_TAB_PB";
        string wlid = "";
        string wlided = "";
        string ebomid = "";
        string loadebomid = "";
        string pbomid = "";
        string loadpbomid = "";
        string loadwlid = "";
        string loadtmid = ""; string loadycpid = "";
        string loadwpcswlid = "";
        private string  EBOMMB = Guid.NewGuid().GetString();
        private string PBOMMB = Guid.NewGuid().GetString();
        private string FCMB = Guid.NewGuid().GetString();
 
        public override void OnInitialize(InitializeEventArgs e)
        { 
            TabControl ctl = this.View.GetControl<TabControl>("F_PJQF_Tab");
            ctl.SetFireSelChanged(true);
        }
    
        public override void TabItemSelectedChange(TabItemSelectedChangeEventArgs e)//页签切换也执行加载页签的动作
        {
            base.TabItemSelectedChange(e);
            currentYeQian = e.TabKey;
            { 
                YeQianload();
            }
           
        }

      
        
        public override void DataChanged(DataChangedEventArgs e)
        {
            base.DataChanged(e);
            if (e.Field.Key == "F_PJQF_ROWID")
            {
                wlid = e.NewValue.GetString();

                YeQianload(); 
            }
        }
     
        void YeQianload()
        {
        //网页端这里设置的容器显示隐藏可能不好用哈,这里是为了实现,打开列表不显示分割容器的下半部分,点击某行后,再显示
            var sp = this.View.GetControl<SplitContainer>("F_PJQF_SpliteContainer"); 
            //sp.SetCustomPropertyValue("SplitPosition", 700);//不加此代码,每次调整分割容器高度,下次打开就记住了,所以这里去掉设置高度了
            sp.HideSecondPanel(false);
             
             
//下面代码和上面的 string loadtmid = ""; string loadycpid = "";等都是为了相同物料,不用重复加载
//反查页签是面板加载系统标准动态表单,其他都是动态字段或单据体
            switch (currentYeQian)
            {
                case "F_PJQF_TAB_PB": //基本信息 
                    if (loadwlid != wlid)
                    {
                        this.View.Model.SetItemValueByID("F_PJQF_DH", wlid, -1);
                        this.View.UpdateView("F_PJQF_DH");
                        loadwlid = wlid;
                    }
                    break;
              
        
                case "F_PJQF_TAB_P1":    //pcs
                    SHOWPCS();
                    break;
        
                case "F_PJQF_TAB_P3":    //反查
                    FCMB = SHOWFC(this.View, "F_PJQF_PanelP3", FCMB);
                    break;
            }

        }

         void SHOWPCS()//面板加载PCS
        {
            if (wlid != "" && loadwpcswlid != wlid)
            {
                string pcssql = string.Format(@"/*dialect*/
select '排产书' 类型, xm.fid,fnumber 
from PJQF_T_FHXX fh
inner join PJQF_T_XMDA xm on xm.fid=fh.fid and xm.F_PJQF_XMDABB='z'
inner join T_PLM_PDM_BASE_M plmm on plmm.FERPMATERIALID=fh.F_PJQF_WLBM
where plmm.fid={0}
union all 
 select  'SIPM' 类型, t.fid,t.fnumber from PJQF_T_PLMPCSe e
 left join PJQF_T_PLMPCS t on e.fid=t.fid
 where F_PJQF_WLID={0}
", wlid);
                DynamicObjectCollection dt = DBUtils.ExecuteDynamicObject(this.Context, pcssql);
                Entity entity = View.BillBusinessInfo.GetEntity("F_PJQF_PCS");
                var PCS = this.View.Model.GetEntityDataObject(entity);
                if (dt.Count > 0)
                {

                    if (!PCS.IsNullOrEmptyOrWhiteSpace())
                    {
                        PCS.Clear();
                    }

                    int i = 0;
                    foreach (var d in dt)
                    {
                        this.View.Model.CreateNewEntryRow("F_PJQF_PCS");
                        this.View.Model.SetValue("F_PJQF_Text0", d["fnumber"].GetString(), i);
                        this.View.Model.SetValue("F_PJQF_LX", d["类型"].GetString(), i);

                        i++;
                    }

                }
                else
                {
                    PCS.Clear();
                }
                loadwpcswlid = wlid;
                this.View.UpdateView("F_PJQF_PCS");
            }

        }

        public string SHOWFC(IDynamicFormView baseView, string panelId, string pageId)//面板加载反查
        {
            IDynamicFormView childView = baseView.GetView(pageId);
            if (childView != null)
            {
                childView.Close();
                baseView.SendDynamicFormAction(childView);
                pageId = Guid.NewGuid().ToString();
            } 
            if (wlid != "")
            {
                //绑定单据
                BillShowParameter billparam = new BillShowParameter 
                {
                    ParentPageId = baseView.PageId,
                    //FormId = "PLM_CFG_RelatedObjectAll",
                    FormId = "PLM_STD_MATERIAL_REVERSE_REF",
                    //FormId = "PLM_PDM_1030100000000000000",
                    // IsShowFilter = true

                };
                billparam.OpenStyle.TagetKey = panelId;
                billparam.OpenStyle.ShowType = ShowType.InContainer;
                billparam.PageId = pageId;
                billparam.CustomComplexParams.Add("plm_param_Platform_RelateObjId", wlid);
                billparam.CustomComplexParams.Add("plm_param_FCategoryId", 1010000000000000000); 
                billparam.CustomComplexParams.Add("plm_param_Platform_RelateObjMaterialId", wlid);//这里是重点,需要这个参数
                billparam.Status = OperationStatus.VIEW;
                billparam.PKey = wlid;
                billparam.FormId = "PLM_STD_MATERIAL_REVERSE_REF";
                billparam.Caption = "BOM";
                
                //billparam.OpenStyle.TagetKey = "FPanel_ReverseBomRef";
                billparam.CustomComplexParams["plm_param_SourceObjectId"] = wlid;
                //billparam.CustomComplexParams.Add("plm_param_IsHistory", false);
                //billparam.CustomComplexParams.Add("plm_param_IsVersionBill",false);
                //billparam.CustomComplexParams.Add("plm_param_HistoryVersionInfo","");
                //billparam.CustomComplexParams["showFilterRow"] = "True";
                baseView.ShowForm(billparam);
                return pageId;
            }
            else return null;
        }
    
 
 
    }


}


zyk.zip(3.50KB)

赞 10