经验分享:U9跑MRP卡死解决过程

2022/08/30

这篇文章发布于 594 天前,部分信息可能已经发生变化。

问题:MRP卡住很久

用户反馈:跑MRP卡在供需对比

image-20221213230539812

查看日志:

在 System.Data.DataTable.NewRecordFromArray(Object[] value)
   在 System.Data.DataRowCollection.Add(Object[] values)
   在 mrp.internals.DataCollection.LoadData(DataTable fromtable, DataTable totable)
   在 mrp.internals.MRPItemCollection.LoadData()
   在 mrp.internals.MRPSource.LoadData()
   在 mrp.MRP.Run()
   在 UFIDA.U9.MRP.MRP.MRPCalcMainImpementStrategy.Netting(PlanVersion planversion)
   在 UFIDA.U9.MRP.MRP.MRPCalcMainImpementStrategy.Do(Object obj)
System.ArgumentException: 值对于 Int32 太大或太小。不能在 MultQty 列中存储 <99999999999.000000000>。所需类型是 Int32。 ---> System.OverflowException: 值对于 Int32 太大或太小。
   at mscorlib!0x06000d4e!System.Decimal.FCallToInt32(Decimal d)
   at mscorlib!0x06000d83!System.Decimal.System.IConvertible.ToInt32(IFormatProvider provider) +0x0
   at System.Data!0x060030fb!System.Data.Common.Int32Storage.Set(Int32 record, Object value) +0x1b
   at System.Data!0x06000872!System.Data.DataColumn.set_Item(Int32 record, Object value) +0x0
   --- End of inner exception stack trace ---
   at System.Data!0x06000872!System.Data.DataColumn.set_Item(Int32 record, Object value) +0x16
   at System.Data!0x06000d03!System.Data.DataTable.NewRecordFromArray(Object[] value) +0x98
   at System.Data!0x06000b5b!System.Data.DataRowCollection.Add(Object[] values) +0x0
   at UFIDA.U9.MRP.Netting.Impl!0x0600000d!mrp.internals.DataCollection.LoadData(DataTable fromtable, DataTable totable) +0x30
   at UFIDA.U9.MRP.Netting.Impl!0x0600068d!mrp.internals.MRPItemCollection.LoadData() +0xe1
   at UFIDA.U9.MRP.Netting.Impl!0x06000700!mrp.internals.MRPSource.LoadData() +0x17
   at UFIDA.U9.MRP.Netting.Impl!0x060005a5!mrp.MRP.Run() +0x3d
   at UFIDA.U9.MRP.MRPBP!0x06000075!UFIDA.U9.MRP.MRP.MRPCalcMainImpementStrategy.Netting(PlanVersion planversion) +0x9f
   at UFIDA.U9.MRP.MRPBP!0x06000065!UFIDA.U9.MRP.MRP.MRPCalcMainImpementStrategy.Do(Object obj) +0x100
==========
MODULE: mscorlib => mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;
MODULE: System.Data => System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;
MODULE: UFIDA.U9.MRP.MRPBP => UFIDA.U9.MRP.MRPBP, Version=25.5401.40664.0, Culture=neutral, PublicKeyToken=null; G:5a02181a5e99485c94183744faeeb5bb; A:1
MODULE: UFIDA.U9.MRP.Netting.Impl => UFIDA.U9.MRP.Netting.Impl, Version=25.5401.40654.0, Culture=neutral, PublicKeyToken=null; G:4421d3143a244e0290ed9bdcf2a74d9f; A:1

[70][      ][08:16:01][ERROR][MRP.MRPCalcMainStub]-System.ArgumentException: 值对于 Int32 太大或太小。不能在 MultQty 列中存储 <99999999999.000000000>。所需类型是 Int32。 ---> System.OverflowException: 值对于 Int32 太大或太小。
   at mscorlib!0x06000d4e!System.Decimal.FCallToInt32(Decimal d)
   at mscorlib!0x06000d83!System.Decimal.System.IConvertible.ToInt32(IFormatProvider provider) +0x0
   at System.Data!0x060030fb!System.Data.Common.Int32Storage.Set(Int32 record, Object value) +0x1b
   at System.Data!0x06000872!System.Data.DataColumn.set_Item(Int32 record, Object value) +0x0
   --- End of inner exception stack trace ---
   at UFIDA.U9.MRP.MRPBP!0x06000065!UFIDA.U9.MRP.MRP.MRPCalcMainImpementStrategy.Do(Object obj) +0x1db
   at UFSoft.UBF.AopFrame!0x06000089!UFSoft.UBF.AopFrame.BaseStrategy.Execute(Object obj) +0xd3
   at UFIDA.U9.MRP.MRPBP!0x06000062!UFIDA.U9.MRP.MRP.MRPCalcMain.Do() +0x8
   at UFIDA.U9.MRP.MRPBP!0x06000087!UFIDA.U9.MRP.MRP.MRPCalcMainStub.DoEx(ICommonDataContract commonData, EntityKey planVersion, Int32 type, Int32 partition, Boolean isRunMRPImmediately) +0x73
==========
MODULE: mscorlib => mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;
MODULE: System.Data => System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;
MODULE: UFIDA.U9.MRP.MRPBP => UFIDA.U9.MRP.MRPBP, Version=25.5401.40664.0, Culture=neutral, PublicKeyToken=null; G:5a02181a5e99485c94183744faeeb5bb; A:1
MODULE: UFSoft.UBF.AopFrame => UFSoft.UBF.AopFrame, Version=25.5401.28703.0, Culture=neutral, PublicKeyToken=null; G:0809f490fd724f81a1691244438967e5; A:1

[70][      ][08:16:02][ERROR][Service.ServerDynamicProxy]-System.ArgumentException: 值对于 Int32 太大或太小。不能在 MultQty 列中存储 <99999999999.000000000>。所需类型是 Int32。 ---> System.OverflowException: 值对于 Int32 太大或太小。
   at mscorlib!0x06000d4e!System.Decimal.FCallToInt32(Decimal d)
   at mscorlib!0x06000d83!System.Decimal.System.IConvertible.ToInt32(IFormatProvider provider) +0x0
   at System.Data!0x060030fb!System.Data.Common.Int32Storage.Set(Int32 record, Object value) +0x1b
   at System.Data!0x06000872!System.Data.DataColumn.set_Item(Int32 record, Object value) +0x0
   --- End of inner exception stack trace ---
   at UFIDA.U9.MRP.MRPBP!0x06000065!UFIDA.U9.MRP.MRP.MRPCalcMainImpementStrategy.Do(Object obj) +0x1db
   at UFSoft.UBF.AopFrame!0x06000089!UFSoft.UBF.AopFrame.BaseStrategy.Execute(Object obj) +0xd3
   at UFIDA.U9.MRP.MRPBP!0x06000062!UFIDA.U9.MRP.MRP.MRPCalcMain.Do() +0x8
   at UFIDA.U9.MRP.MRPBP!0x06000087!UFIDA.U9.MRP.MRP.MRPCalcMainStub.DoEx(ICommonDataContract commonData, EntityKey planVersion, Int32 type, Int32 partition, Boolean isRunMRPImmediately) +0x73
==========
MODULE: mscorlib => mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;
MODULE: System.Data => System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;
MODULE: UFIDA.U9.MRP.MRPBP => UFIDA.U9.MRP.MRPBP, Version=25.5401.40664.0, Culture=neutral, PublicKeyToken=null; G:5a02181a5e99485c94183744faeeb5bb; A:1
MODULE: UFSoft.UBF.AopFrame => UFSoft.UBF.AopFrame, Version=25.5401.28703.0, Culture=neutral, PublicKeyToken=null; G:0809f490fd724f81a1691244438967e5; A:1

[70][      ][08:16:02][ERROR][Executable.JobExecutable]-ent:01,Job Execute Error1:值对于 Int32 太大或太小。不能在 MultQty 列中存储 <99999999999.000000000>。所需类型是 Int32。
[70][      ][08:16:02][ERROR][Executable.JobExecutable]-   在 UFSoft.UBF.Service.ServerDynamicProxy.Invoke(IMessage myIMessage)
   在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   在 UFIDA.U9.MRP.MRP.Proxy.IMRPCalcMain.Do(IContext context, IList`1& outMessages, EntityKey planVersion, Int32 type, Int32 partition, Boolean isRunMRPImmediately)
   在 UFIDA.U9.MRP.MRP.Proxy.MRPCalcMainProxy.InvokeImplement[T](T oChannel)
   在 UFSoft.UBF.Service.Base.ProxyBase.InvokeAgent[T]()
   在 UFIDA.U9.MRP.MRP.Proxy.MRPCalcMainProxy.Do()

分析源代码

  1. 根据日志:方法mrp.internals.DataCollection.LoadData 找到对应DLL,反编译:

  2. "值对于 Int32 太大或太小":U9源代码把字段“MultQty”设置为Int32,而且在数据库中对应字段“PurchaseMultiQty”是decimal(24,9),Int32保存数值99999999999.000000000发生异常System.ArgumentException;

  3. “PurchaseMultiQty”就是MRP产生的采购数量,到底哪个料品产生如此大的采购数量呢?通过SQL可以得知

image-20221213230853550

image-20221213230907135

image-20221213230917360

  • 查找到数据来源表:MRP_ExpandItemMapping_Temp

    SELECT Item,PurchaseMultiQty, * FROM  MRP_ExpandItemMapping_Temp WHERE Org=1002006124586648 AND PurchaseMultiQty>999999
    

    image-20221213231000146

SELECT Code, * FROM CBO_ItemMaster WHERE ID=1002108055991861

image-20221213231032887

最终确定问题:

发现是料号:30100630 问题,经过沟通是实施工程师为了:不让采购使用这个料号刻意这样设置。取消错误2处料品资料,从新跑MRP成功!💪

image-20221213231112381