二开插件-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二开插件-BeforeSelectF7动态构建单据体,并做过滤
一,具体实现功能如下: 某个单据的单据体当中的文本字段设置一个可编辑按钮,对应添加BeforeSelectF7事件,弹出一个动态表单,动态表单上添...
点击下载文档文档为doc格式
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
上一篇
已经是第一篇



