二开插件-BeforeSelectF7动态构建单据体,并做过滤
一,具体实现功能如下:
某个单据的单据体当中的文本字段设置一个可编辑按钮,对应添加BeforeSelectF7事件,弹出一个动态表单,动态表单上添加一个单据体,单据体内容均由代码动态构建,单据体的具体内容为某张单据的所有单据头字段的集合,可通过多选/单选返回数据至源单单据体上,动态绑定数据。
二,前期准备:
仅需一个空白的动态表单上添加一个单据体,添加两个按钮tbReturnData返回数据 /tbClose-关闭
三,代码思路
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.GetControl("F_BL_SelectData").Enabled = true; for (int i = 0; i < dyobj.Count; i++) { this.Model.BatchCreateNewEntryRow(entityKey, 1); this.Model.SetValue("F_BL_FieldIdent1", dyobj[i][0], i); this.Model.SetValue("F_BL_FieldIdent2", dyobj[i][1], i); this.Model.SetValue("F_BL_FieldIdent3", dyobj[i][2], i); } this.Model.EndIniti(); } /// <summary> /// 子窗体传值回父窗体 /// </summary> /// <param name="ElementType"></param> /// <returns></returns> ///单据体行双击事件 public override void EntityRowDoubleClick(EntityRowClickEventArgs e) { base.EntityRowDoubleClick(e); List<DynamicObject> sum = new List<DynamicObject>(); int rowIndex = this.Model.GetEntryCurrentRowIndex(entityKey);//获取双击选中行的行号 var billObj = this.View.Model.DataObject; var entity = (DynamicObjectCollection)billObj["EngProcessEntity"]; var date = entity[rowIndex]; //获取选中行的数据包 sum.Add(date); this.View.ReturnToParentWindow(sum); this.View.Close(); } ///tbReturnData按钮点击事件 public override void AfterBarItemClick(AfterBarItemClickEventArgs e) { base.AfterBarItemClick(e); if (e.BarItemKey == "tbReturnData") { List<DynamicObject> sum = new List<DynamicObject>(); //单据体数据 DynamicObjectCollection selectedRowsDy = this.Model.DataObject["EngProcessEntity"] as DynamicObjectCollection; if (selectedRowsDy.Count==0) return; //获取选中行数据 for (int i = 0; i < selectedRowsDy.Count(); i++) { if (Convert.ToString(selectedRowsDy[i][1]).ToUpper()=="TRUE") { sum.Add(selectedRowsDy[i]); } } this.View.ReturnToParentWindow(sum); this.View.Close(); } } } }
2.源单BeforeSelectF7事件
using Kingdee.BOS.Core.Bill.PlugIn; using Kingdee.BOS.Core.DynamicForm; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Core.List; using Kingdee.BOS.Core.Metadata.EntityElement; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.ServiceHelper; using Kingdee.BOS.Util; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BL.K3.Plugln.Bill.ENGRouteProcess { [Description("二开-作业表单插件,实现自定义单据体数据的动态绑定"), HotUpdate] public class EngProcessBillPlugln: AbstractBillPlugIn { public override void BeforeF7Select(BeforeF7SelectEventArgs e) { base.BeforeF7Select(e); try { if (this.Context.CurrentOrganizationInfo.ID == 225169) return; //非101组织 if (e.FieldKey.Equals("F_BL_parameterName")) { List<object> ParameterIds = new List<object>(); List<object> ParameterTypes = new List<object>(); DynamicFormShowParameter form = new DynamicFormShowParameter(); form.FormId = "QPUB_EngParameter";//动态表单-作业参数 form.MultiSelect = true; //获取单据体当前的数据进行过滤 Entity entry = this.View.BusinessInfo.GetEntity("FParaterEntity"); var entity = (DynamicObjectCollection)this.Model.GetEntityDataObject(entry); if (entity.Count != 0 && entity != null) { foreach (var obj in entity) { //参数标识 var ParameterId = obj["F_BL_ParameterId"]; if (ParameterId != null && !ParameterId.IsNullOrEmptyOrWhiteSpace()) { ParameterIds.Add(ParameterId); } //参数类型 if (obj["F_BL_ParameterTypes"] != null && !obj["F_BL_ParameterTypes"].IsNullOrEmptyOrWhiteSpace()) { ParameterTypes.Add(obj["F_BL_ParameterTypes"]); } } } if (ParameterIds != null && ParameterIds.Count != 0) { //父窗体传值到子窗体 form.CustomComplexParams.Add("FSelectId", ParameterIds); } if (ParameterTypes.Count != 0 && ParameterTypes != null) { //父窗体传值至子窗体 form.CustomComplexParams.Add("SelectTypes", ParameterTypes); } this.View.ShowForm(form, new Action<FormResult>((result) => { //接受子窗体选中返回的数据 if (result.ReturnData != null&&result!=null) { List<DynamicObject> dt = (List<DynamicObject>)result.ReturnData; bool first = false; for (int i = 0; i < dt.Count;i++ ) { if (first) continue; if (dt[i][4].ToString() == "单据体") first = true; this.Model.BeginIniti(); this.Model.SetValue("F_BL_ParameterId", dt[i][2], e.Row+i);//参数标识 this.Model.SetValue("F_BL_parameterName", dt[i][3], e.Row + i);//参数名 this.Model.SetValue("F_BL_ParameterTypes", dt[i][4], e.Row + i);//参数类型 this.Model.BatchCreateNewEntryRow("FParaterEntity", 1); this.Model.EndIniti(); this.View.UpdateView("FParaterEntity"); } } })); this.View.UpdateView("F_BL_parameterName", e.Row); } } catch (Exception ex) { throw new Exception(ex.Message); } } } }
二开插件-BeforeSelectF7动态构建单据体,并做过滤
一,具体实现功能如下: 某个单据的单据体当中的文本字段设置一个可编辑按钮,对应添加BeforeSelectF7事件,弹出一个动态表单,动态表单上添...
点击下载文档
本文2024-09-16 18:15:59发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-21018.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章