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