10.1.600 -> 2021.2

Version 10.1.600 → 2021.2

This topic covers tips, tricks and known issues for making the jump between the two above sessions.

We decided to use Kinetic screens unless there was a customization on the screen. This gives the users a chance to learn the new UI while staying in business. We’ll slowing migrate those customizations to Kinetic and any new customization work will be done with Application Studio. Some dashboards will be replaced with EDD cards on the Active Home Page.

And I’m excited to have Epicor Functions again!

Tips:

Built the version we were going live with (11.1.200.20) and practiced upgrades by restoring the database and performing the upgrade. (Made about ten passes).

Made screen fixes and saved them in a solution per customization. After each test run, we imported those solutions. Did the same for a handful of Directives and an SSRS report from 3rd party consultant.

Used the newish Personalization Purge Utility and Purged. Them. All. Reduced a lot of classic screen issues.

Had to redeploy EDD and Enterprise Search each upgrade attempt. :person_shrugging:

Did not try to AutoUpdate clients. Pre-installed client through login scripts.

We upgraded SQL, so had to remember to raise compatibility level (150 for SQL 2019).
Previous database had all three Task Agent slots and had to delete records from Ice.ExtServiceRegistration table per EpicCare article.

Known Issues:

For client printing, we see the spinning icon while waiting for a printer to show. If it lasts longer, we close the print form and try again. May be fixed in later versions than K2021.2. Not using Edge Client yet.

1 Like

@Mark_Wonsil - did you ever come across any issues launching the client in “Modern” mode? We just finished our install of 2021.2 this morning and we’re only able to launch in Classic. Sometimes we get an error and other times it just crashes without a peep. The prevailing thought is that it’s a customization problem. I’m about to start going through and clearing out all our customizations with the intent of bringing them back 1 at a time. Before I get too far ahead of myself, I just wanted to probe the waters and see if you had any experience like this or heard of it?

image

Server Side Exception
A server error occurred. Review the server event logs for details.

Exception caught in: Epicor.ServiceModel

Error Detail
============
Correlation ID: b5bdeb2a-7ea1-41df-85f7-e9ab520faaaa
Description: A server error occurred. Review the server event logs for details.
Program: Epicor.Ice.Server.Wcf.Core.dll
Method: ProvideFault
Line Number: 33
Column Number: 17
Server Trace Stack: at Epicor.Hosting.Wcf.ErrorHandler.ProvideFault(Exception error, MessageVersion version, Message& fault) in C:_releases\ICE\ICE4.1.200.30\Source\Server\Hosting\Wcf\Ice.Server.Wcf.Core\Hosting\Wcf\ErrorHandler.cs:line 33
at System.ServiceModel.Dispatcher.ErrorBehavior.ProvideFault(Exception e, FaultConverter faultConverter, ErrorHandlerFaultInfo& faultInfo)
at System.ServiceModel.Dispatcher.ErrorBehavior.ProvideMessageFaultCore(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage8(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.MessageRpc.ProcessError(Exception e)
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.SecurityChannelListener1.ReceiveItemAndVerifySecurityAsyncResult2.InnerTryReceiveCompletedCallback(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.MenuImpl.GetRowsTranslated(String whereClauseMenu, Int32 pageSize, Int32 absolutePage, Boolean& morePages)
at Ice.Lib.UI.MenuCache.GetTranslatedMenus(Session session, String whereClause)
at Ice.Lib.UI.MenuCache.GetMenu(Session session)
at Ice.Lib.UI.SessionCache.get_CurrentSessionMenus()
at IceShell.MenuDataManager.get_MenuData()
at IceShell.SessionManager.loadHistory()
at IceShell.SessionManager.loadUserSettings(String userID, Boolean changeUserEvent)
at IceShell.SessionManager.InitializeInitialSession(Session initialSession)
at IceShell.SessionManager.<.ctor>b__32_1(Object _, SessionChangedEventArgs e)
at Ice.Lib.UI.SessionCache.OnInitialSessionChangedEvent(SessionChangedEventArgs e)
at Ice.Lib.UI.SessionCache.SetInitialSession(Session session)
at Ice.Lib.UI.SessionCache.set_CurrentSession(Session value)
at IceShell.SplashScreenApp.logon_LogonEnded(Object sender, EventArgs e)
at IceShell.Apps.LogonDialog.OnLogonEnded(Object sender, EventArgs e)
at IceShell.Apps.LogonDialog.StopLogon()
at IceShell.Apps.LogonDialog.DoWorkLogon()
at IceShell.Apps.LogonDialog.btnOK_ButtonClick(Object sender, InputEventArgs e)
at IceShell.ImageButton.Click(InputEventArgs e)
at IceShell.ImageButton.OnAccessKeyPressed(Object sender, AccessKeyPressedEventArgs e)
at System.Windows.Input.AccessKeyPressedEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
at System.Windows.Input.AccessKeyManager.GetInfoForElement(IInputElement element, String key)
at System.Windows.Input.AccessKeyManager.GetTargetsForScope(Object scope, String key, IInputElement sender, AccessKeyInformation senderInfo)
at System.Windows.Input.AccessKeyManager.GetTargetsForSender(IInputElement sender, String key)
at System.Windows.Input.AccessKeyManager.ProcessKeyForSender(Object sender, String key, Boolean existsElsewhere, Boolean userInitiated)
at System.Windows.Input.AccessKeyManager.OnKeyDown(KeyEventArgs e)
at System.Windows.Input.AccessKeyManager.PostProcessInput(Object sender, ProcessInputEventArgs e)
at System.Windows.Input.InputManager.RaiseProcessInputEventHandlers(ProcessInputEventHandler postProcessInput, ProcessInputEventArgs processInputEventArgs)
at System.Windows.Input.InputManager.ProcessStagingArea()
at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
at System.Windows.Interop.HwndKeyboardInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawKeyboardActions actions, Int32 scanCode, Boolean isExtendedKey, Boolean isSystemKey, Int32 virtualKey)
at System.Windows.Interop.HwndKeyboardInputProvider.ProcessKeyAction(MSG& msg, Boolean& handled)
at System.Windows.Interop.HwndSource.CriticalTranslateAccelerator(MSG& msg, ModifierKeys modifiers)
at System.Windows.Interop.HwndSource.TranslateAcceleratorCore(MSG& msg, ModifierKeys modifiers)
at System.Windows.Interop.HwndSource.System.Windows.Interop.IKeyboardInputSink.TranslateAccelerator(MSG& msg, ModifierKeys modifiers)
at System.Windows.Forms.Integration.ElementHost.ProcessCmdKey(Message& msg, Keys keyData)
at IceShell.Apps.Controls.WinformsControlHost.ProcessCmdKey(Message& msg, Keys keyData)
at System.Windows.Forms.Control.PreProcessMessage(Message& msg)
at System.Windows.Forms.Control.PreProcessControlMessageInternal(Control target, Message& msg)
at System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg)

Hey Dan!

Our upgrade strategy is to use Kinetic where we can and use classic where we must. If we went against all warnings against putting code into our customizations, well, that’s technical debt we have to pay now. But we didn’t want to delay the upgrade. Now that we’ve been live for a couple of months, we are redoing customizations in Application Studio starting with the easy ones (add a UD field to a screen for example). For the others, we’ll move the code to an Epicor Function and then fix the customization in Application Studio. Our goal is to move forward as fast but as reliably as we can.

2 Likes