Here’s a weird situation where one customer (in Customer Entry, 10.0.700.4) seems to require something in the CustCnt.EmailAddress field.If it’s missing, I get this error message when I save, but can’t find where it’s coming from:
I created a test customer that doesn’t have an email, and Epicor took it without error. I can also delete and save in Person Contact Maintenance. How can I figure out what’s causing this pop-up?
Tried:
- I figured it’s a BPM, but couldn’t see one connected either to the Customer or CustCnt methods that would cause. We’ve got 3 BPM’s connected to the Customer.Update method, but none seem to do this. Is there a way to search for the text in the error message if I export all the BPM’s?
- I didn’t see a data directive that would do that (just a change log), or something in Extended Property Maintenance making it required.
- I turned on trace after deleting the email and clicking save, and it points to CustCntImpl, but I only see CustCnt in Method Directive Maintenance.
Thanks for any suggestions!
Here’s snippets of the trace to preserve the innocent (I can provide more if nec…)
<tracePacket>
<businessObject>Erp.Proxy.BO.CustCntImpl</businessObject>
<methodName>Update</methodName>
<returnType>System.Void</returnType>
<localTime>4/24/2018 15:57:55:3774008 PM</localTime>
<executionTime>235</executionTime>
<parameters>
<parameter name="ds" type="CustCntDataSet">
<CustCntDataSet xmlns="http://www.epicor.com/Ice/300/BO/CustCnt/CustCnt">
<CustCnt>
...SNIP...
<paramDataSetChanges>
<paramDataSet name="ds" useDataSetNbr="0">
<changedValue tableName="CustCnt" rowState="Modified" rowNum="0" colName="EMailAddress"><![CDATA[]]></changedValue>
</paramDataSet>
</paramDataSetChanges>
And the full error message:
Business Layer Exception
A valid Email Address is required.
Exception caught in: Epicor.ServiceModel
Error Detail
Description: A valid Email Address is required.
Program: Erp.Services.BO.CustCnt.dll
Method: CustCntBeforeUpdate
Table: CustCnt
Field: EmailAddress
Server Trace Stack: at Erp.Services.BO.CustCntSvc.CustCntBeforeUpdate()
at Ice.Services.Trace.TablesetProfilingCollector.DoRowEventTrace(String tableName, String methodName, Int32 rowCount, Action action)
at Ice.TablesetBound3.UpdateRow(IceDataContext context, Int32 tableNum, IIceTable table, IceRow updatedRow, IceRow originalRow, TablesetProfilingCollector parentTraceCollector) at Ice.TablesetBound
3.WriteTable(IceDataContext context, Int32 tableIndex, IIceTable table, TablesetProfilingCollector parentTraceCollector)
at Ice.TablesetBound3.InnerUpdate(IceDataContext context, TFullTableset tableset) at Erp.Services.BO.CustCntSvc.Update(CustCntTableset& ds) at Erp.Services.BO.CustCntSvcFacade.Update(CustCntTableset& ds) at SyncInvokeUpdate(Object , Object[] , Object[] ) at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) at Epicor.Hosting.OperationBoundInvoker.Invoke(Object instance, Func
2 func)
at Epicor.Hosting.Wcf.EpiOperationInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(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.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
at System.Runtime.AsyncResult.Complete(Boolean completedSynchronously)
at System.ServiceModel.Channels.SecurityChannelListener1.ReceiveItemAndVerifySecurityAsyncResult
2.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.Security.NegotiateStream.ProcessFrameBody(Int32 readBytes, Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.NegotiateStream.ReadCallback(AsyncProtocolRequest asyncRequest)
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.ServiceModel.Channels.SocketConnection.OnReceiveAsync(Object sender, SocketAsyncEventArgs eventArgs)
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 Erp.Proxy.BO.CustCntImpl.Update(CustCntDataSet ds)
at Erp.Adapters.CustCntAdapter.OnUpdate()
at Ice.Lib.Framework.EpiBaseAdapter.Update()
at Erp.UI.App.CustomerEntry.Transaction.UpdateContacts()