UOM conversion not found Configurator

When I test my configurator via Test Inputs or Test Rules it works fine, but when I actually try to use it on a quote I get an exception before the configurator form can even load. How can I figure out which material is causing the error??

Business Layer Exception

Unit of measure conversion not found for Class:Each  UOM:Pounds

Exception caught in: Epicor.ServiceModel

Error Detail 
============
Description:  Unit of measure conversion not found for Class:Each  UOM:Pounds
Program:  Erp.Internal.Lib.AppService.dll
Method:  UOMConv3
Line Number:  2740
Column Number:  17
Server Trace Stack:     at Erp.Internal.Lib.AppService.UOMConv3(Int32 VendorNum, String OpCode, String PartNum, Decimal QtyIn, String fromuom, String touom, String v_Direction, Decimal& QtyOut, Boolean SuppressErrors, Nullable`1 EffectiveDate) in C:\_Releases\ERP\UD10.2.100.5\Source\Server\Internal\Lib\AppService\AppService.cs:line 2740
   at Erp.Internal.Lib.AppService.UOMConv2(Int32 VendorNum, String OpCode, String PartNum, Decimal QtyIn, String fromuom, String touom, String v_Direction, Decimal& QtyOut, Boolean SuppressErrors) in C:\_Releases\ERP\UD10.2.100.5\Source\Server\Internal\Lib\AppService\AppService.cs:line 2592
   at Erp.Internal.PC.GenerateMethods.Do_QuoteMtl(Int32 RelOpr, String In_PartNum, String In_RevisionNum, String In_AltMethod, Int32 In_AsmSeq, Int32 In_BomLevel, String In_GeneratedRuleTag) in C:\_Releases\ERP\UD10.2.100.5\Source\Server\Internal\PC\GenerateMethods\GenerateMethods.cs:line 4894
   at Erp.Internal.PC.GenerateMethods.Do_QuoteBOM(String In_PartNum, String In_RevisionNum, String In_AltMethod, Int32 In_AsmSeq, Int32 In_BomLevel, String iip_GeneratedRuleTag, LinqRow foreignRow) in C:\_Releases\ERP\UD10.2.100.5\Source\Server\Internal\PC\GenerateMethods\GenerateMethods.cs:line 3569
   at Erp.Internal.PC.GenerateMethods.Do_PcQuote(Int32 In_TargetAsm_Seq, String PartNum, String RevisionNum, String AltMethod, String GeneratedRuleTag, LinqRow foreignRow) in C:\_Releases\ERP\UD10.2.100.5\Source\Server\Internal\PC\GenerateMethods\GenerateMethods.cs:line 3381
   at Erp.Internal.PC.GenerateMethods.CreateQuote(String InPartNum, String InRevisionNum, String InBasePartNum, String InBaseRevisionNum, String GeneratedRuleTag, LinqRow relatedRow, LinqRow foreignRow, String InBaseAltMethod) in C:\_Releases\ERP\UD10.2.100.5\Source\Server\Internal\PC\GenerateMethods\GenerateMethods.cs:line 3024
   at Erp.Internal.PC.GenerateMethods.RunProcessKeepWhen(ConfigurationSequenceTableset& configurationSequenceDS, RunningState state, String structTag, Int32 structID, String parentAltMethod, LinqRow relatedRow, LinqRow foreignRow, Boolean& existsInBOM, Int32 GroupSeq, String forPartNum, String forRevisionNum, IConfiguration configuration) in C:\_Releases\ERP\UD10.2.100.5\Source\Server\Internal\PC\GenerateMethods\GenerateMethods.cs:line 681
   at Erp.Internal.PC.GenerateMethods.RunProcessKeepWhen(ConfigurationSequenceTableset& configurationSequenceDS, RunningState state, String structTag, Int32 structID, String parentAltMethod, LinqRow relatedRow, LinqRow foreignRow, IConfiguration configuration, Boolean checkNextCfg, Boolean& enableNextPage) in C:\_Releases\ERP\UD10.2.100.5\Source\Server\Internal\PC\GenerateMethods\GenerateMethods.cs:line 699
   at Erp.Services.BO.ConfigurationRuntimeSvc.ProcessKeepWhen(ConfigurationSequenceTableset& configurationSequenceDS, ConfigurationRuntimeTableset& configRuntimeDS, PcValueTableset pcValueDS, String parAltMethod, Boolean checkNextCfg, Boolean& enableNextPage) in C:\_Releases\ERP\UD10.2.100.5\Source\Server\Services\BO\ConfigurationRuntime\ConfigurationRuntime.cs:line 1762
   at Erp.Services.BO.ConfigurationRuntimeSvcFacade.ProcessKeepWhen(ConfigurationSequenceTableset& configurationSequenceDS, ConfigurationRuntimeTableset& configRuntimeDS, PcValueTableset pcValueDS, String parAltMethod, Boolean checkNextCfg, Boolean& enableNextPage) in C:\_Releases\ERP\UD10.2.100.5\Source\Server\Services\BO\ConfigurationRuntime\ConfigurationRuntimeSvcFacade.cs:line 497
   at SyncInvokeProcessKeepWhen(Object , Object[] , Object[] )
   at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
   at Epicor.Hosting.OperationBoundInvoker.InnerInvoke(Object instance, Func`2 func) in F:\f\E10Dev\ICE\Releases\3.2.100\ICE3.2.100.5\Source\Framework\Epicor.System\Hosting\OperationBoundInvoker.cs:line 59
   at Epicor.Hosting.OperationBoundInvoker.Invoke(Object instance, Func`2 func) in F:\f\E10Dev\ICE\Releases\3.2.100\ICE3.2.100.5\Source\Framework\Epicor.System\Hosting\OperationBoundInvoker.cs:line 28
   at Epicor.Hosting.Wcf.EpiOperationInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) in F:\f\E10Dev\ICE\Releases\3.2.100\ICE3.2.100.5\Source\Framework\Epicor.System\Hosting\Wcf\EpiOperationInvoker.cs:line 23
   at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
   at System.ServiceModel.Dispatcher.ChannelHandler.DispatchAndReleasePump(RequestContext request, Boolean cleanThread, OperationContext currentOperationContext)
   at System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest(RequestContext request, OperationContext currentOperationContext)
   at System.ServiceModel.Dispatcher.ChannelHandler.AsyncMessagePump(IAsyncResult result)
   at System.ServiceModel.Dispatcher.ChannelHandler.OnAsyncReceiveComplete(IAsyncResult result)
   at System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
   at System.Runtime.AsyncResult.Complete(Boolean completedSynchronously)
   at System.ServiceModel.Channels.SecurityChannelListener`1.ReceiveItemAndVerifySecurityAsyncResult`2.InnerTryReceiveCompletedCallback(IAsyncResult result)
   at System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
   at System.Runtime.AsyncResult.Complete(Boolean completedSynchronously)
   at System.Runtime.InputQueue`1.AsyncQueueReader.Set(Item item)
   at System.Runtime.InputQueue`1.EnqueueAndDispatch(Item item, Boolean canDispatchOnThisThread)
   at System.Runtime.InputQueue`1.EnqueueAndDispatch(T item, Action dequeuedCallback, Boolean canDispatchOnThisThread)
   at System.ServiceModel.Channels.SingletonChannelAcceptor`3.Enqueue(QueueItemType item, Action dequeuedCallback, Boolean canDispatchOnThisThread)
   at System.ServiceModel.Channels.HttpPipeline.EnqueueMessageAsyncResult.CompleteParseAndEnqueue(IAsyncResult result)
   at System.ServiceModel.Channels.HttpPipeline.EnqueueMessageAsyncResult.HandleParseIncomingMessage(IAsyncResult result)
   at System.Runtime.AsyncResult.AsyncCompletionWrapperCallback(IAsyncResult result)
   at System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
   at System.Runtime.AsyncResult.Complete(Boolean completedSynchronously)
   at System.ServiceModel.Channels.HttpInput.ParseMessageAsyncResult.OnRead(IAsyncResult result)
   at System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
   at System.Web.Hosting.AsyncResultBase.Complete(Int32 hresult, Boolean synchronous)
   at System.Web.Hosting.PipelineRuntime.AsyncCompletionHandler(IntPtr rootedObjectsPointer, Int32 bytesCompleted, Int32 hresult, IntPtr pAsyncCompletionContext)



Client Stack Trace 
==================
   at Epicor.ServiceModel.Channels.ImplBase`1.ShouldRethrowNonRetryableException(Exception ex, DataSet[] dataSets)
   at Erp.Proxy.BO.ConfigurationRuntimeImpl.ProcessKeepWhen(ConfigurationSequenceDataSet configurationSequenceDS, ConfigurationRuntimeDataSet configRuntimeDS, PcValueDataSet pcValueDS, String parAltMethod, Boolean checkNextCfg, Boolean& enableNextPage)
   at Erp.Adapters.ConfigurationRuntimeAdapter.ProcessKeepWhen(PcValueDataSet pcValueDS, String parAltMetthod, Boolean checkNextCfg, Boolean& enableNextPage)

Evan,

Are you using a Super BOM (Keep When) or Templates (Set Field) configurator?

If Super BOM, one of those parts has a UOM of Pounds and there is no conversion to Each (or vice-versa). If Templates, then you’ll have to look at your pool of part numbers (from tables, code, whatever) that you’re assigning to the place-holder.

Mark W.

I think I am using a little bit of both methods, for materials that could be many different part numbers I just use a template material, but for a material that is either kept or discarded but is always the same part number I just use Keep When rules.

What I don’t get how any of that is a problem before the configurator even loads. I choose the part numbers based off input values, which I have no idea what their values might be before the form loads.

Right, you’re not even at a Get Details yet…Hmmm

Have you added any new place-holder part numbers?

There are on load events that might be executing. I wonder if you need to block some logic until the form is completely loaded? Could there be an “…else…” running that’s assigning a part number?

Mark W.

The On load for the form doesn’t do anything with the parts/BOM

The Stack Trace looks like some Set Field logic is running against a quote line though…

Mark W.

I removed all code from the On Load for the form, I still get the error.

Sorry, I’m not being clear. You have assignments to QuoteMtl that are happening during the load. In your template code, you may need to prevent these assignments during that initial load of the configurator. If this configurator was working before, I would concentrate on the fields you added that affect QuoteMtl lines, specifically the part number. If these rules are firing, we need to find a way to prevent this unwanted behavior (test for null strings, previously required fields set, etc.)

Of course, it could be a bug!

Mark W.

1 Like

I set all my material rules to “Never execute” and I still get the error. I will re-check the template parts… but I am pretty sure they have the same UOM as another revision which has no problem…

1 Like

I made a new revision, with the three materials that are measured in “Each” on it, and I don’t get an error with that one… Confusing, I hope I don’t have to make a new revision from scratch.

1 Like

GAH! I finally found it, there were some places that I wasn’t checking for empty strings. Wish I could have noticed sooner, would have saved me so much time :sob:

2 Likes

Sorry, I wasn’t clear a second time…

No, I saw that you said that, I just thought that setting the rule “Never run” and not 'Always run" would keep it from running! But the empty strings were still causing errors even with all the rules disabled, as if they were being run anyway.

Well, at least you got it. I’m pretty sure I was bitten by this before myself.

1 Like

@Evan_Purdy I’m having the same problem, was the issue within one of the method rules? Or in the Keep When rule? Or elsewhere?

I’d appreciate any help in tracking this down. Thanks very much.

I had to add checks to the “keep when” rule to make sure that the rule actions don’t run if one of the inputs is depends on is null or empty.

Thanks for the quick reply.

I’ve done some more testing and I suspect my issue is related to the Parent part having multiple UOMs. I’ve reduced the BOM down to 1 item and it generates the UOM error when the method rule tries to add the item. I’m going to create another Parent with a single UOM and see if that works.

Edit - scratch that idea, same behaviour when the Parent has a single UOM. Sigh, have to try some other ideas.