电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

二开插件-BeforeSelectF7动态构建单据体,并做过滤

来源:金蝶云社区作者:金蝶2024-09-162

二开插件-BeforeSelectF7动态构建单据体,并做过滤

一,具体实现功能如下:

    某个单据的单据体当中的文本字段设置一个可编辑按钮,对应添加BeforeSelectF7事件,弹出一个动态表单,动态表单上添加一个单据体,单据体内容均由代码动态构建,单据体的具体内容为某张单据的所有单据头字段的集合,可通过多选/单选返回数据至源单单据体上,动态绑定数据。

二,前期准备:

    仅需一个空白的动态表单上添加一个单据体,添加两个按钮tbReturnData返回数据 /tbClose-关闭
image.webp


三,代码思路

    1.动态表单上添加一个动态构建动态表单单据体的插件,在打开的时候构建该动态表单。

    2.源单上添加插件做BeforeSelectF7事件,弹出该动态表单。

四,具体代码

    1.创建动态表单

using Kingdee.BOS;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.ControlElement;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BL.K3.Plugln.Bill.ENGRouteProcess
{

    [Description("二开-【动态表单插件】-作业-作业参数动态表单动态去构建单据体数据包"),HotUpdate]
    public class CreateDynamicEntity : AbstractDynamicFormPlugIn
    {
        #region var
        private const string entityKey = "F_BL_EngProcessEntity";//单据体标识
        private String[] fieldNames = new String[] {"选中数据","字段标识", "字段名称", "字段类型" };//需要动态创建列的列名
        private BusinessInfo _currInfo;
        private LayoutInfo _currLayout;
        #endregion
        //获取作业单据的元数据
        private List<String[]> GetXmlData()
        {
            List<String[]> sum = new List<string[]>();
            FormMetadata formMetadata = (FormMetadata)MetaDataServiceHelper.Load(this.Context, "QPUB_BL_Parameter");
            var fields = formMetadata.BusinessInfo.GetFieldList().FindAll(o => o.FieldName.ToUpper() != "FBILLNO" 
                                                                            && o.FieldName.ToUpper() != "F_BL_ENGPROCESS" 
                                                                            && o.FieldName.ToUpper() != "FPROCESSID" 
                                                                            && o.FieldName.ToUpper() != "F_BL_ROUTEID" 
                                                                            && o.FieldName.ToUpper() != "F_BL_ROUTEOPERSEQ" 
                                                                            && o.FieldName.ToUpper() != "F_BL_PROCESSSEQNUMBER"
                                                                            && o.FieldName.ToUpper() != "F_BL_WORKHOUR"
                                                                           // && o.FieldName.ToUpper() != "F_BL_REMARK"
                                                                            && o.EntityKey == "FBillHead");
            var entity = formMetadata.BusinessInfo.Entrys.FindAll(o => o.EntryName != "BillHead");
            foreach (var field in fields)
            {
                String[] obj = new String[3];
                obj[0] = field.FieldName;//字段标识
                obj[1] = field.Name;//字段名称
                String sql = String.Format("Select Fname from T_MDL_ELEMENTTYPE_L where fid = '{0}'", field.ElementType);
                var result = DBServiceHelper.ExecuteDynamicObject(this.Context, sql);
                obj[2] = Convert.ToString(result[0][0]);//字段类型
                sum.Add(obj);
            }
            foreach (var entry in entity)
            {
                String[] obj = new String[3];
                obj[0] = entry.EntryName;
                obj[1] = entry.Name;
                String sql = String.Format("Select Fname from T_MDL_ELEMENTTYPE_L where fid = '{0}'", entry.ElementType);
                var result = DBServiceHelper.ExecuteDynamicObject(this.Context, sql);
                obj[2] = Convert.ToString(result[0][0]);//字段类型
                sum.Add(obj);
            }
            return sum;
        }
        //初始化数据后调用构建数据包
        public override void AfterBindData(EventArgs e)
        {
            base.AfterBindData(e);            
            Search();
        }
        //查询
        private void Search()
        {
            List<String[]> dyobj = GetXmlData();
            if (dyobj != null)
            {
                // 修改元数据
                this.ReBuildFields(dyobj);
                // 根据新的元数据,重构单据体表格列
                EntryGrid grid = this.View.GetControl<EntryGrid>(entityKey);
                grid.SetAllowLayoutSetting(false); // 列按照索引显示
                grid.Enabled = false; //不可编辑
                EntityAppearance listAppearance = _currLayout.GetEntityAppearance(entityKey);
                grid.CreateDyanmicList(listAppearance);
                // 填充数据
                this.SetData(dyobj);
                // 下达一个指令
                this.View.SendDynamicFormAction(this.View);
                this.View.UpdateView(entityKey); //解决单据体刷新
            }
        }
        //在此事件当中初始化元数据时触发该事件
        public override void OnSetBusinessInfo(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.SetBusinessInfoArgs e)
        {
            base.OnSetBusinessInfo(e);
            // 复制界面元数据到本地变量
            FormMetadata currMeta = (FormMetadata)ObjectUtils.CreateCopy(
            this.View.OpenParameter.FormMetaData);
            _currInfo = currMeta.BusinessInfo;
            _currLayout = currMeta.GetLayoutInfo();
            // 用本地的元数据,替换动态表单引擎持有的元数据
            e.BusinessInfo = _currInfo;
            e.BillBusinessInfo = _currInfo;
        }
        //通常在该事件当中去修改界面的元数据
        public override void OnSetLayoutInfo(SetLayoutInfoArgs e)
        {
             e.LayoutInfo = _currLayout;
             e.BillLayoutInfo = _currLayout;
        }
        //构建单据体字段
        private void ReBuildFields(List<String[]> dyobj)
        {
            Entity entity = _currInfo.GetEntity(entityKey);
            EntityAppearance entityApp = _currLayout.GetEntityAppearance(entityKey);
            // 添加字段,构建列   
            for (int i = 0; i < fieldNames.Count(); i++)
            {
                if (i == 0)
                {
                    //构建复选框按钮            
                    CheckBoxField cbField = new CheckBoxField();
                    cbField.Key = "F_BL_SelectData";
                    cbField.Id = "F_BL_SelectData";
                    cbField.Name = new LocaleValue("选中数据");
                    cbField.PropertyName = "F_BL_SelectData";
                    cbField.EntityKey = entityKey;
                    cbField.Entity = entity;
                    _currInfo.Add(cbField);
                    CheckBoxFieldAppearance fieldA = new CheckBoxFieldAppearance();
                    fieldA.Key = cbField.Key;
                    fieldA.Caption = cbField.Name;
                    fieldA.EntityKey = cbField.EntityKey;
                    fieldA.Width = new LocaleValue("90");
                    fieldA.LabelWidth = new LocaleValue("80");
                    fieldA.Tabindex = i;
                    fieldA.Field = cbField;
                    fieldA.TextEditStyle = 1;
                    _currLayout.Add(fieldA);
                }
                else
                {
                    //构建文本字段
                    Field fld = new TextField();
                    fld.Key = String.Format("F_BL_FieldIdent{0}", i);
                    fld.Id = String.Format("F_BL_FieldIdent{0}", i);
                    fld.Name = new LocaleValue(fieldNames[i]);
                    fld.PropertyName = String.Format("F_BL_FieldIdent{0}", i);
                    fld.EntityKey = entityKey;
                    fld.Entity = entity;
                    _currInfo.Add(fld);
                    TextFieldAppearance fldApp = new TextFieldAppearance();
                    fldApp.Key = fld.Key;
                    fldApp.Caption = fld.Name;
                    fldApp.EntityKey = fld.EntityKey;
                    fldApp.Width = new LocaleValue("100");
                    fldApp.LabelWidth = new LocaleValue("80");
                    fldApp.Tabindex = i;
                    fldApp.Field = fld;
                    fldApp.TextEditStyle = 1;
                    _currLayout.Add(fldApp);
                }
            }
        }
        //构建单据体数据
        private void SetData(List<String[]> dyobj)
        {
            // 使用最新的元数据,重新界面数据包
            _currInfo.GetDynamicObjectType(true);            
            //获取父窗体单据体已有数据            
            var FSelectId = this.View.OpenParameter.GetCustomParameter("FSelectId");
            if (!FSelectId.IsNullOrEmptyOrWhiteSpace())
            {
                List<object> List = (List<object>)FSelectId;
                //构建数据中去除已经选择在单据体当中的数据
                for (int i = 0; i < dyobj.Count; i++)
                {
                    for (int j = 0; j < List.Count; j++)
                    {
                        //用编码标识去进行判断,去除已选择的记录
                        if (dyobj[i][0] == List[j].ToString())
                        {
                            dyobj.RemoveAt(i);
                            i--;
                            break;
                        }
                    }
                }               
            }
            //构建数据中判断当前作业是否已经选择单据体表,若已选择,至多只允许选择一个单据体
            var SelectTypes = this.View.OpenParameter.GetCustomParameter("SelectTypes");
            if (!SelectTypes.IsNullOrEmptyOrWhiteSpace())
            {
                List<object> List = (List<object>)SelectTypes;
                var result = List.FindAll(o => o.ToString() == "单据体");
                //参数中已经选择了单据体字段,构建参数当中移除所有单据体字段
                if (result.Count > 0)
                {
                    dyobj.RemoveAll(o => o[2].ToString() == "单据体");
                }
            }
            this.Model.CreateNewData(); 
            this.Model.BeginIniti();
            this.View

二开插件-BeforeSelectF7动态构建单据体,并做过滤

一,具体实现功能如下: 某个单据的单据体当中的文本字段设置一个可编辑按钮,对应添加BeforeSelectF7事件,弹出一个动态表单,动态表单上添...
点击下载文档文档为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

已经是第一篇
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信