下推结果页面--批量更新所有数据包的数据原创
金蝶云社区-eris
eris
5人赞赏了该文章 263次浏览 未经作者许可,禁止转载编辑于2024年04月12日 12:00:34

一、说明

1)单据批量下推,产生了多张单据,一张一张单据修改字段值非常麻烦,有时候值都是一样的,希望更新一张单据的值其他单据的值也能够一起更新,既批量更新所有数据包的值。

2)注意:7.5(2020,11)之后版本,已支持了单据头字段批量填充的功能,需要进行下面配置才可以使用:

2.1 )批量填充的字段要勾选值触发事件。

2.2) 扩展“批量生成下游单据页面(BOS_ConvertResultForm)”, 在页面菜单集合中增加标识为“tbBatchFill”的菜单,菜单名一般叫批量填充,即可。



二、实现方式

批量下推的结果数据包是放在下推列表页面的视图Session中,但是一旦加载了下推结果页面就会把数据包删除,只保留在下推结果页面的插件中,其他地方无法取到。下推结果页面会嵌套加载目标单据,并且按其列表选中行加载目标单据数据包。主要难点是在目标单据表单插件中得到所有的下推结果数据包,有两种方式。

1)使用反射,目标单据是嵌套在下推结果页面的,从而父视图就是下推结果页面,通过父视图得到下推结果页面插件实例,再通过反射得到插件实例中的所有数据包。

2)扩展下推结果页面,加入一个新表单插件,在运行下推结果页面标准插件删除父视图存储的所有数据包之前事件中获取到下推结果数据包,并保存在下推结果页面视图中,从而在目标单据插件中就可以得到。

三、示例,使用反射的方式实现

单据A批量下推单据B,在下推结果页面给任何一张单据B的文本字段赋值,会更新所有单据B数据。

注意:单据B的文本字段需要勾选上即时触发值更新事件

1)实现代码为单据B表单插件

using System;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel;
using System.Reflection;

using Kingdee.BOS.Util;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Bill;
using Kingdee.BOS.Core.DynamicForm;
using  Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.DynamicForm.PlugIn;

namespace Kingdee.BOS.TestPlugIn22.FormPlugin
{
    [HotUpdate]
    [Description("单据测试插件")]
    public class TestFormPlugIn : AbstractBillPlugIn
    {
        //下推结果页面插件全名
        private const string ConvertResultPlugInFullName = "Kingdee.BOS.Business.DynamicForm.ConvertPlugIn.ConvertResultFormEdit,Kingdee.BOS.Business.DynamicForm";
        //所有下推结果数据包
        private DynamicObject[] _resultDataObjs = null;
		
        /// <summary>
        /// 
        /// </summary>
        /// <param name="e"></param>
        public override void OnInitialize(InitializeEventArgs e)
        {
            base.OnInitialize(e);
            //父页面是下推结果页面
            if (this.View.ParentFormView != null && this.View.ParentFormView.BillBusinessInfo != null &&
                this.View.ParentFormView.BillBusinessInfo.GetForm().Id.EqualsIgnoreCase("BOS_ConvertResultForm"))
            {
                //得到下推结果页面运行中的插件
                var parentView = this.View.ParentFormView;
                var eventProxy = parentView.GetService<DynamicFormViewPlugInProxy>(); //得到插件代理
                var convertResultPlugIn = eventProxy.PlugIns.FirstOrDefault(x => x.ToString().EndsWith("ConvertResultFormEdit"));
                if (convertResultPlugIn != null)
                {
                    //通过反射得到所有的下推结果数据
                    Type convertResultPlugInType = Type.GetType(ConvertResultPlugInFullName);
                    BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;
                    var resultObjsField = convertResultPlugInType.GetField("_ResultObjs", flag);
                    this._resultDataObjs = resultObjsField.GetValue(convertResultPlugIn) as DynamicObject[];
                }
            }
        }

        /// <summary>
        /// 值更新事件,这里字段需要勾选上即时触发值更新事件才会走
        /// </summary>
        /// <param name="e"></param>
        public override void DataChanged(DataChangedEventArgs e)
        {
            base.DataChanged(e);
            if (this._resultDataObjs != null)
            {
                var textField = this.View.BillBusinessInfo.GetField(e.Key);
                var textFieldValue = this.Model.GetValue(textField);
                if (textField != null && e.Key.EqualsIgnoreCase("F_Jac_Text"))
                {
                    //使用文本值更新其他数据包
                    foreach (var dataObj in this._resultDataObjs)
                    {
                        if (this.Model.DataObject != dataObj)
                        {
                            dataObj[textField.PropertyName] = textFieldValue;
                        }
                    }
                }
            }
        }
    }
}

2)实现效果

image.pngimage.png


赞 5