单据转换插件中新增行

需求:在单据转换插件中,根据源单得到的多行数据 .某一行有数据 a=100,b=5,这个时候需要新增一条记录
 a=5,b=0,其它数据不变,然后插入到目标单,并且将新增这一行数据在 目标单的C字段赋值为"赠品",原来一行赋值为"非赠品".


单据转换插件,基类为 Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.AbstractConvertPlugIn,派生此类,派生的插件类,注册到单据转换规则的"插件策略"。根据需求,重载AfterConvert方法即可实现,事件的参数e.Result 就是生成的下游单据完整的数据包,可以进行数据检索、单据体行插入等数据处理。

特别注意:如果需要赠品行,也能够检索到源单行,必须同时复制关联子单据体行。

单据的数据包就像一颗树,有一个根点,然后逐层的往下伸展,经过单据体、子单据体或者关联子单据体。
因此,从根要找到单据体的全部行,还是比较困难的,需要递归。为了方便快速检索全部单据体行,而无视其层次结构,系统提供了ExtendDataEntitySet数据结构,提供FindByEntityKey()方法快速检索指定单据体的所有行,这个函数返回的数据集合,与数据包的树无关,你向这个集合中添加新的行,并没有添加到根数据包中,只是一个游离的,无归属的行,当然显示不出来。

可以通过如下示意代码添加新行(未经调试,请勿直接复制使用):

ExtendedDataEntity[] rows = e.Result.FindByEntityKey("FPOOrderEntry");
Entity entity = e.TargetBusinessInfo.GetEntity("FPOOrderEntry");
Entity deliveryEntity = e.TargetBusinessInfo.GetEntity("FEntryDeliveryPlan");
foreach(var row in rows)
{
     DyanmicObject oldRow = row.DataEntity;
     if (oldRow 符合新增行条件)
     {
           // 取本行对应的单据数据包,本行是单据数据包的子存在
           DynamicObject billDataObj = oldRow.Parent as DynamicObject;
           // 取单据数据包的行集合,只有向这个集合添加数据行,才能显示出来
           DynamicObjectCollection billEntryRows = entity.DynamicProperty.GetValue(billDataObj) as DynamicObjectCollection;
            // 用如下语句产生一个全新新行数据包
            // DynamicObject newRow = new DynamicObject(entity.DynamicObjectType);
           // TODO : 复制字段值 oldRow -> newRow
           
           // 向新行插入送货计划子行: 首先获取新行的送货计划子行集合,然后向此集合中增加一新行
           DynamicObjectCollection deliveryRows = diliveryEntity.DynamicProperty.GetValue(newRow) as DynamicObjectCollection;
           deliveryRows.Clear();
           DynamicObject newDeliveryRow = new DynamicObject(deliveryEntity.DynamicObjectType);
           deliveryRows.Add(newDeliveryRow);
           // TODO : 填写送货计划子行字段值
           
           // 把新行插入到旧行之后,以便用户清楚的看到原始订单内容与对应的赠品
           billEntityRows.Insert(billEntityRows.IndexOf(oldRow), newRow);

           // 对每个单据的全部行,进行行序号重排(本处为示意代码,实际代码请放在循环外执行,避免重复排序)
           int seq = 1;
           foreach(var entityRow in billEntryRows)
           {
                 entity.SeqDynamicProperty.SetValue(entityRow, seq);
                 seq++;
           }
     }
}



原文地址:https://www.cnblogs.com/fyq891014/p/4188813.html