辅助属性操作使用总结
金蝶云社区-PP
PP
5人赞赏了该文章 2502次浏览 未经作者许可,禁止转载编辑于2018年05月11日 17:56:02
封面

在单据转换插件中对辅助属性操作使用总结

如题所描述的单据转换插件中对辅助属性处理,其实不局限于单据转换插件中,应该适用于服务端插件,特别是不能通过this.View.Model操作数据的情况。

论坛中有关辅助属性操作的帖子挺多,但都未对辅助属性有深刻的描述,再此呼吁有关专业人士提供更详尽的资料。

1.场景及需求描述:

(1)物料维度页签--启用了两个辅助属性,分别为:表面、规格
(2)单据转换规则:销售订单(成品) --下推--->采购订单(原料)
其中需要辅助插件实现成品到原料的转换即BOM分解,且成品的辅助属性值和原料的辅助属性值是不同的,需要在插件中进行组装。
比如:销售订单中辅助属性为【表面:红色+晶泳,规格:6米】、BOM中原料辅助属性为【表面:红色,规格:无】,需要在采购订单中显示的辅助属性为【表面:红色,规格:6米】。

2.描述下失败的方案:
整体思路是先将订单的辅助属性下推到采购订单,然后在单据转换插件的AfterConvert方法中目标单数据进行加工。

I:保存之后,辅助属性为空;
所以先取到【规格:6米】,然后组装一个新的辅助属性对象,转换之后保存单据,发现辅助属性不能保存,重新打开单据显示为空。以下为部分代码:

  1. DynamicObject newAuxObj = new DynamicObject(auxObj.DynamicObjectType);

  2. newAuxObj["F100003"]= 6米;//【A】方便描述,实际是个Objet类型

  3. newAuxObj["F100003_Id"]= 6米_Id;

  4. ...

  5. // 依次给辅助属性赋值,然后将赋值到单据数据对象entryObj

  6. entryObj["AuxPropId"] = newAuxObj;


  7. // 由于规格已经变化,所以ID不能使用原来的,如果不将ID清空,保存后,仍是原来的辅助属性值,即【A】代码未生效

  8. entryObj["AuxPropId_Id"] = 0L;


复制代码


II:保存之后,辅助属性还是旧值,更新的规格并未生效。将【I】中代码entryObj["AuxPropId_Id"] = 0L屏蔽掉就是这种情况。

总结以上两种失败的方案:
辅助属性需要保存必须设置其Id值,在实体上为“AuxPropId_Id”,基础资料赋值应该也是如此。

3.最终成功方案:
按辅助属性回填的原理来实现,具体代码片段:

  1. // 使用销售订单的长度修正规格型号值:

  2. DynamicObject newAuxObj = new DynamicObject(auxObj.DynamicObjectType);

  3. newAuxObj[matStrs] = matStr;

  4. newAuxObj[matStrs + "_Id"] = matStrId;

  5. newAuxObj[model] = modelObj;

  6. newAuxObj[model + "_Id"] = modelId;

  7. entryObj["AuxPropId"] = newAuxObj;

  8. // 调用辅助属性保存服务:处理规则和框架一致

  9. FlexSaveServiceHelper.BatchSaveEntityFlexObject(ctx, targetBizInfo, targetBizInfo.GetEntity("FOrderEntry"), new DynamicObject[] { billObj });

  10.                            

  11. // 获取辅助属性ID

  12. long auxPropId = FlexServiceHelper.GetFlexDataId(ctx, newAuxObj, FormIdConst.BD_FLEXSITEMDETAILV);

  13. newAuxObj["Id"] = auxPropId;

  14. 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


赞 5