发货通知单下推分布试调出单报错问题排查
问题总结:
问题1、报错“表达式计算出错:FDestMaterialID = FMaterialID(请先录入调入库存组织内容(调入物料))”
配置步骤:在单据转换做的到分步式调出单的单据映射是发货通知单的对应组织映射到分步式掉出单的调入组织。并且做了表单服务策略是调入物料=物料编码。但是清除缓存后就可以下推了,不定时清楚缓存
解决方案:偶发性问题,每次清除缓存可正常使用,暂未定位出原因。该服务策略的配置是为了解决调入物料的赋值,实际根据系统标准插件的逻辑会做相应赋值处理,不需要特殊配置 未避免出现此类错误,可将该表单服务策略取消,至于调入物料未赋值参考下面问题的解决方案。
问题2、不做表单服务策略"调入物料=物料编码", 下推调入物料编码为空,没有进行赋值
问题3、下推组织内调拨,调入物料赋值为空,跨组织调拨,调入物料正常赋值
分析:从系统的处理逻辑看,在单据转换插件中OnCreateLink方法中会取调入组织及物料编码,取对应调入物料的内码,进行赋值,OnCreateLink方法执行时字段映射关系方法已经执行完,之所以出现"下推组织内调拨,调入物料赋值为空,跨组织调拨,调入物料正常赋值",是因为:
跨组织调拨:上游单据对应组织不为空,映射到分步式调出单调入组织,在取调入物料数据时,正常获取到调入组织,赋值成功
组织内调拨:上游单据对应组织不为空,映射到分步式调出单调入组织,在取调入物料数据时,获取调入组织为空,进而导致获取调入物料为空,赋值失败
解决方案:配置Python脚本,判断是组织内调拨,强制进行调入物料的赋值
import clr clr.AddReference("System") clr.AddReference("Kingdee.BOS") clr.AddReference("Kingdee.BOS.Core") clr.AddReference("Kingdee.BOS.App") clr.AddReference('Kingdee.BOS.ServiceHelper') clr.AddReference('Kingdee.BOS.DataEntity') clr.AddReference("Kingdee.BOS.App.Core") clr.AddReference('Kingdee.BOS.ServiceHelper') clr.AddReference("Kingdee.BOS.Contracts") from System import * from System import StringComparison from Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args import * from Kingdee.BOS.App.Data import * from System.Collections.Generic import * from Kingdee.BOS.ServiceHelper import * from Kingdee.BOS.Core.Metadata import SelectorItemInfo from Kingdee.BOS.Core.SqlBuilder import QueryBuilderParemeter from Kingdee.BOS.Orm.DataEntity import * from Kingdee.BOS.Contracts import * from Kingdee.BOS.App.Core import * def AfterConvert(e): dataObjs = e.Result.FindByEntityKey("FBillHead"); viewService = ViewService() for dataObj in dataObjs: transferBizType = dataObj.DataEntity["FTransferBizType"] if transferBizType == "InnerOrgTransfer": stockInOrgId = Convert.ToInt64(dataObj.DataEntity["StockOrgID_Id"]) entrys = dataObj.DataEntity["STK_STKTRANSFEROUTENTRY"] for entry in entrys: material = entry["MaterialId"] if material is not None: bdfield = e.TargetBusinessInfo.GetField("FDestMaterialID") materialmasterId = Convert.ToInt64(material["msterID"]) p = QueryBuilderParemeter() p.FormId = "BD_MATERIAL" p.SelectItems = SelectorItemInfo.CreateItems("FMaterialId") p.FilterClauseWihtKey = '''FUSEORGID={0} AND FMASTERID={1}'''.format(stockInOrgId, materialmasterId) dyObjs = QueryServiceHelper.GetDynamicObjectCollection(this.Context, p) if dyObjs.Count > 0: materialObj = viewService.LoadSingle(this.Context, dyObjs[0]["FMaterialId"], bdfield.RefFormDynamicObjectType) bdfield.RefIDDynamicProperty.SetValue(entry, dyObjs[0]["FMaterialId"]) bdfield.DynamicProperty.SetValue(entry, materialObj)
另外几个疑问点:
1、上游对应组织为空,映射到调出单调入库存组织正常应该也为空,然而下推却有值,下游的组织是何处何时进行赋值的。二开个插件监控AfterConvert事件,调入组织此时仍然为空
问题4、销售订单 推 发货通知单,出现报错"未将对象引用设置到对象的实例"
分析:单据转换字段的映射配置关系都正确,从报错代码MappingBaseDataField.MappingValue()分析,下推单据转换时基础资料赋值出现报错,单据上基础资料涉及物料、组织、客户等等,最终定位为"对应组织"的问题
解决方案:发货通知单“对应组织”条件随意添加个引用,一般选择编码和名称,保存清理系统缓存即可。如下
发货通知单下推分布试调出单报错问题排查
本文2024-09-16 19:05:57发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-26378.html