Error when trying to Save Layouts on a Customized UI for a dashboard

We are on 10.2.200.40 and I just deployed a dashboard where I added a Customization layer on top of it. When our users are attempting to adjust column widths and then Tools >> Save Layouts, it is giving an error. The main problem is, I don’t know of a Key 3 being anywhere in my BAQ or dashboard.

Error:
The maximum number of characters allowed for Key 3 is 50


The maximum number of characters allowed for Key 3 is 50

Exception caught in: Epicor.ServiceModel

Error Detail 
============
Description:  The maximum number of characters allowed for Key 3 is 50
Program:  Epicor.Ice.dll
Method:  ValidateColumn
Line Number:  253
Column Number:  17
Table:  XXXDef
Field:  Key3
Server Trace Stack:     at Ice.Core.BizRuleEngine.ValidateColumn(IceColumn column, String columnName, Object columnValue) in C:\_Releases\ICE\ICE3.2.200.40\Source\Framework\Epicor.Ice\BizRuleEngine\BizRuleEngine.cs:line 253
   at Ice.Core.BizRuleEngine.ValidateRow() in C:\_Releases\ICE\ICE3.2.200.40\Source\Framework\Epicor.Ice\BizRuleEngine\BizRuleEngine.cs:line 143
   at Ice.Core.BizRuleEngine.Validate(IceRow oldRow, IceRow newRow, LinqRow curRow) in C:\_Releases\ICE\ICE3.2.200.40\Source\Framework\Epicor.Ice\BizRuleEngine\BizRuleEngine.cs:line 125
   at Ice.Services.BO.GenXDataSvc.CreateXXXDef(XXXDefRow ttXXXDefRow, Nullable`1 previousSystemFlag) in C:\_Releases\ICE\ICE3.2.200.40\Source\Server\Services\BO\GenXData\GenXData.cs:line 298
   at Ice.Services.BO.GenXDataSvc.StoreData(GenXDataTableset ds) in C:\_Releases\ICE\ICE3.2.200.40\Source\Server\Services\BO\GenXData\GenXData.cs:line 232
   at Ice.Services.BO.GenXDataSvcFacade.StoreData(GenXDataTableset ds) in C:\_Releases\ICE\ICE3.2.200.40\Source\Server\Services\BO\GenXData\GenXDataSvcFacade.cs:line 296
   at SyncInvokeStoreData(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 C:\_Releases\ICE\ICE3.2.200.40\Source\Framework\Epicor.System\Hosting\OperationBoundInvoker.cs:line 59
   at Epicor.Hosting.OperationBoundInvoker.Invoke(Object instance, Func`2 func) in C:\_Releases\ICE\ICE3.2.200.40\Source\Framework\Epicor.System\Hosting\OperationBoundInvoker.cs:line 28
   at Epicor.Hosting.Wcf.EpiOperationInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) in C:\_Releases\ICE\ICE3.2.200.40\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.TransportDuplexSessionChannel.TryReceiveAsyncResult.OnReceive(IAsyncResult result)
   at System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
   at System.Runtime.AsyncResult.Complete(Boolean completedSynchronously)
   at System.ServiceModel.Channels.SynchronizedMessageSource.ReceiveAsyncResult.OnReceiveComplete(Object state)
   at System.ServiceModel.Channels.SessionConnectionReader.OnAsyncReadComplete(Object state)
   at System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
   at System.Net.LazyAsyncResult.Complete(IntPtr userToken)
   at System.Net.LazyAsyncResult.ProtectedInvokeCallback(Object result, IntPtr userToken)
   at System.Net.Security.NegotiateStream.ProcessFrameBody(Int32 readBytes, Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.NegotiateStream.ReadCallback(AsyncProtocolRequest asyncRequest)
   at System.Net.AsyncProtocolRequest.CompleteRequest(Int32 result)
   at System.Net.FixedSizeReader.CheckCompletionBeforeNextRead(Int32 bytes)
   at System.Net.FixedSizeReader.ReadCallback(IAsyncResult transportResult)
   at System.Runtime.AsyncResult.Complete(Boolean completedSynchronously)
   at System.ServiceModel.Channels.ConnectionStream.IOAsyncResult.OnAsyncIOComplete(Object state)
   at System.Net.Sockets.SocketAsyncEventArgs.OnCompleted(SocketAsyncEventArgs e)
   at System.Net.Sockets.SocketAsyncEventArgs.FinishOperationSuccess(SocketError socketError, Int32 bytesTransferred, SocketFlags flags)
   at System.Net.Sockets.SocketAsyncEventArgs.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
   at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)



Client Stack Trace 
==================
   at Epicor.ServiceModel.Channels.ImplBase`1.ShouldRethrowNonRetryableException(Exception ex, DataSet[] dataSets)
   at Ice.Proxy.BO.GenXDataImpl.StoreData(GenXDataDataSet ds)
   at Ice.Lib.Framework.GenXObject.StoreData(GenXDataDataSet ds)
   at Ice.Lib.Framework.GenXObject.handleChunkAndSave(Boolean doCompression, String company, String productID, String typeCode, String cgcCode, String key1, String key2, String key3, String description, String comment, String version, Boolean layerWIP, String data)
   at Ice.Lib.Framework.GenXObject.ChunkNSaveStringByID(String company, String productID, String typeCode, String cgcCode, String key1, String key2, String key3, String description, String comment, String version, Boolean layerWIP, String data)
   at Ice.Lib.Framework.GenXObject.ChunkNSaveStringByID(String company, String productID, String typeCode, String key1, String key2, String key3, String description, String comment, String version, Boolean layerWIP, String data)
   at Ice.Lib.Framework.FormFunctions.ChunkNSaveStringByID(Session s, String company, String productID, String typeCode, String key1, String key2, String key3, String description, String comment, String version, Boolean layerWIP, String data)
   at Ice.Lib.Framework.FormFunctions.ChunkNSaveStringByID(Object sender, String company, String productID, String typeCode, String key1, String key2, String key3, String description, String comment, String version, Boolean layerWIP, String data)```

I believe the “Key3” being referred to is the personalization data stored in table XXXDef.

Go into customization maintenance and poke around (might need to enable tracing and view what the values of XXXDef.Key3 are.

If it is a value to identify the program custominzation and user, it might be building a value that is bigger than 50 characters.

Does the user having the problem have an unusually long userID?

edit

I just took a peek at the data dictionary:

  • Key1 - Generic key component field. Ex: Customization Name if TypeCode = “Customization” FormName if TypeCode = “Personalization”

  • Key2 - Generic key component field. Ex: FormName Name if TypeCode = “Customization” UserID if TypeCode = “Personalization”

  • Key3 - Generic key component field. Ex: if TypeCode = “Customization” this may contain “WIP” or blanks.

So make a BAQ of XXXDef and see what Key3 has in it for variuos personalizations

3 Likes

Thanks @ckrusen ! You are a lifesaver! The Customization name I had was too long when combined with the saved layout. Shortening the name fixed the issue.

1 Like