在单据转换插件中对辅助属性操作使用总结
如题所描述的单据转换插件中对辅助属性处理,其实不局限于单据转换插件中,应该适用于服务端插件,特别是不能通过this.View.Model操作数据的情况。
论坛中有关辅助属性操作的帖子挺多,但都未对辅助属性有深刻的描述,再此呼吁有关专业人士提供更详尽的资料。
1.场景及需求描述:
(1)物料维度页签--启用了两个辅助属性,分别为:表面、规格
(2)单据转换规则:销售订单(成品) --下推--->采购订单(原料)
其中需要辅助插件实现成品到原料的转换即BOM分解,且成品的辅助属性值和原料的辅助属性值是不同的,需要在插件中进行组装。
比如:销售订单中辅助属性为【表面:红色+晶泳,规格:6米】、BOM中原料辅助属性为【表面:红色,规格:无】,需要在采购订单中显示的辅助属性为【表面:红色,规格:6米】。
2.描述下失败的方案:
整体思路是先将订单的辅助属性下推到采购订单,然后在单据转换插件的AfterConvert方法中目标单数据进行加工。
I:保存之后,辅助属性为空;
所以先取到【规格:6米】,然后组装一个新的辅助属性对象,转换之后保存单据,发现辅助属性不能保存,重新打开单据显示为空。以下为部分代码:
DynamicObject newAuxObj = new DynamicObject(auxObj.DynamicObjectType);
newAuxObj["F100003"]= 6米;//【A】方便描述,实际是个Objet类型
newAuxObj["F100003_Id"]= 6米_Id;
...
// 依次给辅助属性赋值,然后将赋值到单据数据对象entryObj
entryObj["AuxPropId"] = newAuxObj;
// 由于规格已经变化,所以ID不能使用原来的,如果不将ID清空,保存后,仍是原来的辅助属性值,即【A】代码未生效
entryObj["AuxPropId_Id"] = 0L;
复制代码
II:保存之后,辅助属性还是旧值,更新的规格并未生效。将【I】中代码entryObj["AuxPropId_Id"] = 0L屏蔽掉就是这种情况。
总结以上两种失败的方案:
辅助属性需要保存必须设置其Id值,在实体上为“AuxPropId_Id”,基础资料赋值应该也是如此。
3.最终成功方案:
按辅助属性回填的原理来实现,具体代码片段:
// 使用销售订单的长度修正规格型号值:
DynamicObject newAuxObj = new DynamicObject(auxObj.DynamicObjectType);
newAuxObj[matStrs] = matStr;
newAuxObj[matStrs + "_Id"] = matStrId;
newAuxObj[model] = modelObj;
newAuxObj[model + "_Id"] = modelId;
entryObj["AuxPropId"] = newAuxObj;
// 调用辅助属性保存服务:处理规则和框架一致
FlexSaveServiceHelper.BatchSaveEntityFlexObject(ctx, targetBizInfo, targetBizInfo.GetEntity("FOrderEntry"), new DynamicObject[] { billObj });
// 获取辅助属性ID
long auxPropId = FlexServiceHelper.GetFlexDataId(ctx, newAuxObj, FormIdConst.BD_FLEXSITEMDETAILV);
newAuxObj["Id"] = auxPropId;
entryObj["AuxPropId_Id"] = auxPropId;
复制代码
以上代码额外增加的地方主要有两处:
一是:调用FlexSaveService接口,先保存辅助属性值,该值回填到数据对象中
二是:调用FlexServiceHelper.GetFlexDataId,获取到步骤一中的回填辅助属性Id值。
至此解决了需求及遇到的问题。
4.总结
1.辅助属性的使用时,凡涉及到取其中某个辅助属性时处理起来比较麻烦
2.在不能使用this.View.Model的地方写代码组装辅助属性非常麻烦,当前能想到的就是先保存辅助属性然后再取回的方式。
3.辅助属性常用的数据表有:
--辅助属性
select * from T_BD_FLEXAUXPROPERTY
--物料分录--辅助属性值
select * from T_BD_AuxPtyValue
select * from T_BD_AUXPTYVALUEENTITY
select * from T_BD_AUXPTYVALUEENTITY_L
--辅助属性值组合
select * from t_bd_AuxPtyValCom
select * from t_bd_AuxPtyValComEntry
--辅助属性维度数据,可以根据单据上的辅助属性ID从这个表获取数据,用来组装辅助属性实体
select * from T_BD_FLEXSITEMDETAILV
推荐阅读