• 单据转换插件中新增行


    需求:在单据转换插件中,根据源单得到的多行数据 .某一行有数据 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++;
               }
         }
    }



  • 相关阅读:
    winform中key读取修改
    验证时间的正则表达式
    oracle 死锁
    SQL中GETDATE()一些操作
    SQL查询优化
    .config 中特殊字符的处理
    判断二个时间是否在同一周内
    Repeater嵌套(灵活的)
    获取同一字段不同的值
    泛型详解
  • 原文地址:https://www.cnblogs.com/fyq891014/p/4188813.html
Copyright © 2020-2023  润新知