MES - BPM Help

,

For our MES system we would like to scan our key fabs and have it fill in our Employee Number based off our Key Fab number. Once we scan our key fabs, it will enter in the key fab number and execute a “tab” key which pulls the record.

I did a trace of the method called when I look up a valid and invalid EmpID. I believe the method used is: EmployeeBasic - GetRows

I then created a pre-processing method directive and tried getting a message box to appear.
If I entered a valid Employee ID the message box would appear, and if I entered an invalid Employee ID the messagebox would still appear followed by an error that the ID wasn’t valid.

This is all working as expected but once I tried swapping out the messagebox with anything else, lets say a “Set Field” to a static value, it does nothing. If I use “Set Field” and even put a message box after that widget, I’ll still get the message box to appear without any fields getting set. Any thoughts on how to go about this?

Can you post the bpm you have created?

Here is is. It doesn’t set the field but I do get the Messagebox to appear.

This is not a bpm job.

This should be handled in a client customization.

This was just an example to try seeing if I can set any fields.

I am looking to set the EmpID based off their Fab Number from a query, but it doesn’t look like it is setting any fields for me. How would I go about that in a customization?

In a GetRows method, there are no Changed rows, so that’s why it doesn’t do anything. Your “Set Field” widget is setting the value on Changed Rows only.

You wouldn’t want to do this in this method period… but just FYI that’s why it’s not working in this case.

If you want to use BPMs:

You would use a pre-processing on EmpBasic.GetRows,
You would run your own query to get the real employee id,
and you would replace the whereClauseEmpBasic parameter
with the real id.

whereClauseEmpBasic would come in as:

whereClauseEmpBasic = EmpStatus = 'A' AND EmpID = '01389FOBID1378etc' BY Name

but needs to go to base as

whereClauseEmpBasic = EmpStatus = 'A' AND EmpID = 'realEmpID BY Name

That should let you do what you want.

You will probably want some conditionals to check on, to know this should be done,
like if(callContextClient.AssemblyName == "Erp.Menu.Mes") //Ran from MES, etc so you can
know if you need to manipulate this data in this call. (This BO is called from other
things as well)

I don’t do widgets, but I’m sure it can be done.

Here is a custom code skeleton you can translate:

Func<string, string> GetRealIDHere = (fobID) =>
{
    //Do a query here to get real ID
    return "fobIDFromQuery";
};


if(callContextClient.AssemblyName == "Erp.Menu.Mes")
{
    string fobID = whereClauseEmpBasic.Replace("EmpStatus = 'A' AND EmpID = '", String.Empty).Replace("' BY Name", String.Empty);
    
    string realID = GetRealIDHere(fobID);
    
    whereClauseEmpBasic = $"EmpStatus = 'A' AND EmpID = '{realID}' BY Name";
}

I greatly appreciate your response! Your explanation actually taught me how to go about it instead of just trying something without knowing what I am doing.

So I tried using your code skeleton and things went well. I was able to insert a query and get the parameter filled with it. However there is another thing I overlooked, there’s 2-3 more methods called afterwards that probably need their parameters edited. For some reason I thought filling in the first method called would then fill in the next method with the edited parameter and so on.

What would be recommended to do now? Should I set up a bpm on these other methods to update the parameter like I just did or would it be better another way?

I’m low on brain power at the moment, but I will see if I can respond after lunch.

Maybe someone else will pipe up before then.

Give me some more information. Methods, trace, etc.

This still might be better as a client customization, but without more info, I can’t really say.

A hybrid approach may be in order.

Here is the trace log:

<tracegroup name="Start" />

<tracePacket>
  <businessObject>Ice.Proxy.BO.UserTracingImpl</businessObject>
  <methodName>GetNewOrGetByID</methodName>
  <appServerUri>http://erp.gpcerp.com/E10Test/</appServerUri>
  <returnType>Ice.Tablesets.UserTracingTableset</returnType>
  <localTime>2/21/2023 10:23:08:4621645 AM</localTime>
  <threadID>1</threadID>
  <executionTime total="23" roundTrip="22" channel="0" bpm="0" other="1" />
  <retries>0</retries>
  <parameters>
    <parameter name="UserID" type="System.String"><![CDATA[99514.TMonty]]></parameter>
  </parameters>
</tracePacket>

<tracePacket>
  <businessObject>Ice.Proxy.BO.UserTracingImpl</businessObject>
  <methodName>Update</methodName>
  <appServerUri>http://erp.gpcerp.com/E10Test/</appServerUri>
  <returnType>System.Void</returnType>
  <localTime>2/21/2023 10:23:08:4856879 AM</localTime>
  <threadID>1</threadID>
  <executionTime total="22" roundTrip="19" channel="0" bpm="2" other="1" />
  <retries>0</retries>
  <parameters>
    <parameter name="ds" type="Ice.BO.UserTracingDataSet">
      <UserTracingDataSet xmlns="http://www.epicor.com/Ice/300/BO/UserTracing/UserTracing" />
    </parameter>
  </parameters>
</tracePacket>

<tracePacket>
  <businessObject>Erp.Proxy.BO.EmpBasicImpl</businessObject>
  <methodName>GetRows</methodName>
  <appServerUri>http://erp.gpcerp.com/E10Test/</appServerUri>
  <returnType>Erp.Tablesets.EmpBasicTableset</returnType>
  <localTime>2/21/2023 10:23:11:1289152 AM</localTime>
  <threadID>1</threadID>
  <executionTime total="56" roundTrip="50" channel="0" bpm="1" other="5" />
  <retries>0</retries>
  <parameters>
    <parameter name="whereClauseEmpBasic" type="System.String"><![CDATA[EmpStatus = 'A' AND EmpID = '3236' BY Name]]></parameter>
    <parameter name="whereClauseEmpBasicAttch" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseEmpLabExpRate" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseEmpCal" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClausePartner" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseResourceCal" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseEmpRole" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseEntityGLC" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseEmpRoleRt" type="System.String"><![CDATA[]]></parameter>
    <parameter name="pageSize" type="System.Int32"><![CDATA[0]]></parameter>
    <parameter name="absolutePage" type="System.Int32"><![CDATA[0]]></parameter>
    <parameter name="morePages" type="System.Boolean"><![CDATA[False]]></parameter>
  </parameters>
</tracePacket>

<tracePacket>
  <businessObject>Ice.Proxy.BO.MenuImpl</businessObject>
  <methodName>GetRows</methodName>
  <appServerUri>http://erp.gpcerp.com/E10Test/</appServerUri>
  <returnType>Ice.Tablesets.MenuTableset</returnType>
  <localTime>2/21/2023 10:23:11:1892235 AM</localTime>
  <threadID>1</threadID>
  <executionTime total="30" roundTrip="28" channel="0" bpm="0" other="2" />
  <retries>0</retries>
  <parameters>
    <parameter name="whereClauseMenu" type="System.String"><![CDATA[MenuID = 'OMGO3004' OR MenuID = 'JCGO3003' OR MenuID = 'DEGO1080' OR MenuID = 'QAGO0020' OR MenuID = 'JCGO3095' OR MenuID = 'OMGO3002' OR MenuID = 'IMGO3031' OR MenuID = 'DEGO1005' OR MenuID = 'AMMN3146' OR MenuID = 'IMGO3008' OR MenuID = 'IMGO3009' OR MenuID = 'IMGO3083' OR MenuID = 'AMMN3147' OR MenuID = 'IMGO3005' OR MenuID = 'IMGO3006' OR MenuID = 'IMGO3007' OR MenuID = 'IMGO3014' OR MenuID = 'IMGO3015' OR MenuID = 'IMGO3016' OR MenuID = 'IMGO3020' OR MenuID = 'IMGO3001' OR MenuID = 'QAGO0040' OR MenuID = 'JCGO3070' OR MenuID = 'PMGO2002' OR MenuID = 'SRGO1020' OR MenuID = 'SRGO1070' OR MenuID = 'SUGO0500' OR MenuID = 'SRGO1007' OR MenuID = 'JCGO3100' OR MenuID = 'JCGO3065' OR MenuID = 'JCGO3065' OR MenuID = 'JCGO3065' OR MenuID = 'SRGO1030' OR MenuID = 'EQMT2080' OR MenuID = 'DEGO1010' OR MenuID = 'DEGO1050' OR MenuID = 'DEGO1060' OR MenuID = 'DEGO1070' OR MenuID = 'DEGO1030' OR MenuID = 'DEGO1020' OR MenuID = 'DEGO1040' OR MenuID = 'SRGO1001' OR MenuID = 'OMGO3015' OR MenuID = 'OMGO3016' OR MenuID = 'QAGO0050' OR MenuID = 'QAGO0070' OR MenuID = 'IMGO3017' OR MenuID = 'IMGO3019' OR MenuID = 'MPGO1040' OR MenuID = 'SRGO0001' OR MenuID = 'SRGO0020' OR MenuID = 'SRGO1020' OR MenuID = 'SRGO1030' OR MenuID = 'SRGO0010' OR MenuID = 'SRGO1060' OR MenuID = 'AMMN1070' OR MenuID = 'AMMN1060' OR MenuID = 'AMMN1050' OR MenuID = 'AMMN1040' OR MenuID = 'IMGO3013' OR MenuID = 'IMGO3013' OR MenuID = 'MPGO1016' OR MenuID = 'AMMN2001' OR MenuID = 'AMMN2003' OR MenuID = 'SRGO1210' OR MenuID = 'ASGO1200' OR MenuID = 'SRGO2110' OR MenuID = 'MMGO9510' OR MenuID = 'MMGO9520' OR MenuID = 'MMGO9530' OR MenuID = 'MMGO9050' OR MenuID = 'MMGO9700' OR MenuID = 'MMGO9720' OR MenuID = 'MMGO9750' OR MenuID = 'AMGO1520' OR MenuID = 'AMGO1530' OR MenuID = 'AMGO1500' OR MenuID = 'AMGO1510' OR MenuID = 'AMGO1560' OR MenuID = 'AMGO1540' OR MenuID = 'AMGO1550' OR MenuID = 'AMGO190' OR MenuID = 'AMGO1570' BY MenuDesc]]></parameter>
    <parameter name="pageSize" type="System.Int32"><![CDATA[0]]></parameter>
    <parameter name="absolutePage" type="System.Int32"><![CDATA[0]]></parameter>
    <parameter name="morePages" type="System.Boolean"><![CDATA[False]]></parameter>
  </parameters>
</tracePacket>

<tracePacket>
  <businessObject>Erp.Proxy.BO.LaborImpl</businessObject>
  <methodName>GetRows</methodName>
  <appServerUri>http://erp.gpcerp.com/E10Test/</appServerUri>
  <returnType>Erp.Tablesets.LaborTableset</returnType>
  <localTime>2/21/2023 10:23:11:2288495 AM</localTime>
  <threadID>1</threadID>
  <executionTime total="31" roundTrip="29" channel="0" bpm="0" other="2" />
  <retries>0</retries>
  <parameters>
    <parameter name="whereClauseLaborHed" type="System.String"><![CDATA[EmployeeNum = '3236' and ActiveTrans = yes BY EmployeeNum]]></parameter>
    <parameter name="whereClauseLaborDtl" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLaborDtlAttch" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLaborDtlComment" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLaborEquip" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLaborPart" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLbrScrapSerialNumbers" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLaborDtlGroup" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseSelectedSerialNumbers" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseSNFormat" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseTimeWeeklyView" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseTimeWorkHours" type="System.String"><![CDATA[]]></parameter>
    <parameter name="pageSize" type="System.Int32"><![CDATA[0]]></parameter>
    <parameter name="absolutePage" type="System.Int32"><![CDATA[0]]></parameter>
    <parameter name="morePages" type="System.Boolean"><![CDATA[False]]></parameter>
  </parameters>
</tracePacket>

<tracePacket>
  <businessObject>Ice.Proxy.BO.UserFileImpl</businessObject>
  <methodName>GetByID</methodName>
  <appServerUri>http://erp.gpcerp.com/E10Test/</appServerUri>
  <returnType>Ice.Tablesets.UserFileTableset</returnType>
  <localTime>2/21/2023 10:23:11:2619668 AM</localTime>
  <threadID>1</threadID>
  <executionTime total="26" roundTrip="24" channel="0" bpm="0" other="2" />
  <retries>0</retries>
  <parameters>
    <parameter name="userID" type="System.String"><![CDATA[99514.TMonty]]></parameter>
  </parameters>
</tracePacket>

<tracePacket>
  <businessObject>Erp.Proxy.BO.MESMenuImpl</businessObject>
  <methodName>GetMenuData</methodName>
  <appServerUri>http://erp.gpcerp.com/E10Test/</appServerUri>
  <returnType>Erp.Tablesets.MESMenuTableset</returnType>
  <localTime>2/21/2023 10:23:11:2893462 AM</localTime>
  <threadID>1</threadID>
  <executionTime total="98" roundTrip="90" channel="0" bpm="1" other="7" />
  <retries>0</retries>
  <parameters>
    <parameter name="empID" type="System.String"><![CDATA[3236]]></parameter>
    <parameter name="menuTypes" type="System.String"><![CDATA[M~X~]]></parameter>
  </parameters>
</tracePacket>

<tracegroup name="End" />
<tracePacket>
  <businessObject>Erp.Proxy.BO.EmpBasicImpl</businessObject>
  <methodName>GetRows</methodName>
  <appServerUri>http://erp.gpcerp.com/E10Test/</appServerUri>
  <returnType>Erp.Tablesets.EmpBasicTableset</returnType>
  <localTime>2/21/2023 10:23:11:1289152 AM</localTime>
  <threadID>1</threadID>
  <executionTime total="56" roundTrip="50" channel="0" bpm="1" other="5" />
  <retries>0</retries>
  <parameters>
    <parameter name="whereClauseEmpBasic" type="System.String"><![CDATA[EmpStatus = 'A' AND EmpID = '3236' BY Name]]></parameter>
    <parameter name="whereClauseEmpBasicAttch" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseEmpLabExpRate" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseEmpCal" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClausePartner" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseResourceCal" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseEmpRole" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseEntityGLC" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseEmpRoleRt" type="System.String"><![CDATA[]]></parameter>
    <parameter name="pageSize" type="System.Int32"><![CDATA[0]]></parameter>
    <parameter name="absolutePage" type="System.Int32"><![CDATA[0]]></parameter>
    <parameter name="morePages" type="System.Boolean"><![CDATA[False]]></parameter>
  </parameters>
</tracePacket>

<tracePacket>
  <businessObject>Erp.Proxy.BO.LaborImpl</businessObject>
  <methodName>GetRows</methodName>
  <appServerUri>http://erp.gpcerp.com/E10Test/</appServerUri>
  <returnType>Erp.Tablesets.LaborTableset</returnType>
  <localTime>2/21/2023 10:23:11:2288495 AM</localTime>
  <threadID>1</threadID>
  <executionTime total="31" roundTrip="29" channel="0" bpm="0" other="2" />
  <retries>0</retries>
  <parameters>
    <parameter name="whereClauseLaborHed" type="System.String"><![CDATA[EmployeeNum = '3236' and ActiveTrans = yes BY EmployeeNum]]></parameter>
    <parameter name="whereClauseLaborDtl" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLaborDtlAttch" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLaborDtlComment" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLaborEquip" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLaborPart" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLbrScrapSerialNumbers" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLaborDtlGroup" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseSelectedSerialNumbers" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseSNFormat" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseTimeWeeklyView" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseTimeWorkHours" type="System.String"><![CDATA[]]></parameter>
    <parameter name="pageSize" type="System.Int32"><![CDATA[0]]></parameter>
    <parameter name="absolutePage" type="System.Int32"><![CDATA[0]]></parameter>
    <parameter name="morePages" type="System.Boolean"><![CDATA[False]]></parameter>
  </parameters>
</tracePacket>

<tracePacket>
  <businessObject>Ice.Proxy.BO.UserFileImpl</businessObject>
  <methodName>GetByID</methodName>
  <appServerUri>http://erp.gpcerp.com/E10Test/</appServerUri>
  <returnType>Ice.Tablesets.UserFileTableset</returnType>
  <localTime>2/21/2023 10:23:11:2619668 AM</localTime>
  <threadID>1</threadID>
  <executionTime total="26" roundTrip="24" channel="0" bpm="0" other="2" />
  <retries>0</retries>
  <parameters>
    <parameter name="userID" type="System.String"><![CDATA[99514.TMonty]]></parameter>
  </parameters>
</tracePacket>

<tracePacket>
  <businessObject>Erp.Proxy.BO.MESMenuImpl</businessObject>
  <methodName>GetMenuData</methodName>
  <appServerUri>http://erp.gpcerp.com/E10Test/</appServerUri>
  <returnType>Erp.Tablesets.MESMenuTableset</returnType>
  <localTime>2/21/2023 10:23:11:2893462 AM</localTime>
  <threadID>1</threadID>
  <executionTime total="98" roundTrip="90" channel="0" bpm="1" other="7" />
  <retries>0</retries>
  <parameters>
    <parameter name="empID" type="System.String"><![CDATA[3236]]></parameter>
    <parameter name="menuTypes" type="System.String"><![CDATA[M~X~]]></parameter>
  </parameters>
</tracePacket>

Here is what is relevant out of that.

I have questions.

What is the Fob ID?
What is the Real EmpID?
What is the Real EmpNum?
What is the UserID?

I apologize for any missing info\bad explanations

What is the Fob ID?
What is the Real EmpID?
What is the Real EmpNum?

  • Fob ID is a UD field EmpBasic_BadgeID_c and holds a 5 digit code assigned to the employee
  • Emp ID and EmpNum are the same value, pointing to our EmpBasic_EmpID. A 4 digit employee number

What is the UserID?

Our login to Epicor, always starts with “99514.” followed by first letter of first name then last name.

So is the data following the login incorrect?

Might need to see the return data if so.

Here are the details for what I am testing.
I am using one employee.
Fob ID 56885
Employee ID 3236

I am entering in their Fob ID into the EmpID textbox and need it to find their Emp ID and use that instead.

So currently here is my BPM after using your skeleton for EmpBasic.GetRows method
image

Here is the custom code

// set variable for entered fob ID
string fobIDentered = whereClauseEmpBasic

Func<string, string> GetRealIDHere = (fobID) =>
{
    //Do a query here to get real ID
    string fobIDquery = fobIDentered.Substring(29,5);
    string EmployeeID = (from EmpBasic in Db.EmpBasic
                   where EmpBasic.BadgeID_c == fobIDquery
                   select EmpBasic.EmpID).FirstOrDefault();
    return EmployeeID;
};


if(callContextClient.AssemblyName == "Erp.Menu.Mes")
{
    string fobID = whereClauseEmpBasic.Replace("EmpStatus = 'A' AND EmpID = '", String.Empty).Replace("' BY Name", String.Empty);
    
    string realID = GetRealIDHere(fobID);
    
    whereClauseEmpBasic = $"EmpStatus = 'A' AND EmpID = '{realID}' BY Name";
}

At the end of the BPM I have it show a message of the whereClauseEmpBasic parameter
After testing the BPM with 56885 it is returning this message

image
This is exactly how that parameter should be formatted. However it is followed by a couple pop ups saying the Employee ID isn’t valid. So then I check the trace log and it looks like it isn’t updating the parameter in the log. Still using the key fob number 56885.

<tracePacket>
  <businessObject>Ice.Proxy.BO.UserTracingImpl</businessObject>
  <methodName>GetNewOrGetByID</methodName>
  <appServerUri>http://erp.gpcerp.com/E10Test/</appServerUri>
  <returnType>Ice.Tablesets.UserTracingTableset</returnType>
  <localTime>2/21/2023 15:56:03:0928480 PM</localTime>
  <threadID>1</threadID>
  <executionTime total="72" roundTrip="70" channel="0" bpm="0" other="2" />
  <retries>0</retries>
  <parameters>
    <parameter name="UserID" type="System.String"><![CDATA[99514.TMonty]]></parameter>
  </parameters>
</tracePacket>

<tracePacket>
  <businessObject>Ice.Proxy.BO.UserTracingImpl</businessObject>
  <methodName>Update</methodName>
  <appServerUri>http://erp.gpcerp.com/E10Test/</appServerUri>
  <returnType>System.Void</returnType>
  <localTime>2/21/2023 15:56:03:1696449 PM</localTime>
  <threadID>1</threadID>
  <executionTime total="29" roundTrip="26" channel="0" bpm="1" other="2" />
  <retries>0</retries>
  <parameters>
    <parameter name="ds" type="Ice.BO.UserTracingDataSet">
      <UserTracingDataSet xmlns="http://www.epicor.com/Ice/300/BO/UserTracing/UserTracing" />
    </parameter>
  </parameters>
</tracePacket>

<tracePacket>
  <businessObject>Erp.Proxy.BO.EmpBasicImpl</businessObject>
  <methodName>GetRows</methodName>
  <appServerUri>http://erp.gpcerp.com/E10Test/</appServerUri>
  <returnType>Erp.Tablesets.EmpBasicTableset</returnType>
  <localTime>2/21/2023 15:56:08:3266644 PM</localTime>
  <threadID>1</threadID>
  <executionTime total="1671" roundTrip="99" channel="0" bpm="1570" other="2" />
  <retries>0</retries>
  <parameters>
    <parameter name="whereClauseEmpBasic" type="System.String"><![CDATA[EmpStatus = 'A' AND EmpID = '56885' BY Name]]></parameter>
    <parameter name="whereClauseEmpBasicAttch" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseEmpLabExpRate" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseEmpCal" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClausePartner" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseResourceCal" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseEmpRole" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseEntityGLC" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseEmpRoleRt" type="System.String"><![CDATA[]]></parameter>
    <parameter name="pageSize" type="System.Int32"><![CDATA[0]]></parameter>
    <parameter name="absolutePage" type="System.Int32"><![CDATA[0]]></parameter>
    <parameter name="morePages" type="System.Boolean"><![CDATA[False]]></parameter>
  </parameters>
</tracePacket>

<tracePacket>
  <businessObject>Ice.Proxy.BO.MenuImpl</businessObject>
  <methodName>GetRows</methodName>
  <appServerUri>http://erp.gpcerp.com/E10Test/</appServerUri>
  <returnType>Ice.Tablesets.MenuTableset</returnType>
  <localTime>2/21/2023 15:56:09:9987179 PM</localTime>
  <threadID>1</threadID>
  <executionTime total="112" roundTrip="111" channel="0" bpm="0" other="1" />
  <retries>0</retries>
  <parameters>
    <parameter name="whereClauseMenu" type="System.String"><![CDATA[MenuID = 'OMGO3004' OR MenuID = 'JCGO3003' OR MenuID = 'DEGO1080' OR MenuID = 'QAGO0020' OR MenuID = 'JCGO3095' OR MenuID = 'OMGO3002' OR MenuID = 'IMGO3031' OR MenuID = 'DEGO1005' OR MenuID = 'AMMN3146' OR MenuID = 'IMGO3008' OR MenuID = 'IMGO3009' OR MenuID = 'IMGO3083' OR MenuID = 'AMMN3147' OR MenuID = 'IMGO3005' OR MenuID = 'IMGO3006' OR MenuID = 'IMGO3007' OR MenuID = 'IMGO3014' OR MenuID = 'IMGO3015' OR MenuID = 'IMGO3016' OR MenuID = 'IMGO3020' OR MenuID = 'IMGO3001' OR MenuID = 'QAGO0040' OR MenuID = 'JCGO3070' OR MenuID = 'PMGO2002' OR MenuID = 'SRGO1020' OR MenuID = 'SRGO1070' OR MenuID = 'SUGO0500' OR MenuID = 'SRGO1007' OR MenuID = 'JCGO3100' OR MenuID = 'JCGO3065' OR MenuID = 'JCGO3065' OR MenuID = 'JCGO3065' OR MenuID = 'SRGO1030' OR MenuID = 'EQMT2080' OR MenuID = 'DEGO1010' OR MenuID = 'DEGO1050' OR MenuID = 'DEGO1060' OR MenuID = 'DEGO1070' OR MenuID = 'DEGO1030' OR MenuID = 'DEGO1020' OR MenuID = 'DEGO1040' OR MenuID = 'SRGO1001' OR MenuID = 'OMGO3015' OR MenuID = 'OMGO3016' OR MenuID = 'QAGO0050' OR MenuID = 'QAGO0070' OR MenuID = 'IMGO3017' OR MenuID = 'IMGO3019' OR MenuID = 'MPGO1040' OR MenuID = 'SRGO0001' OR MenuID = 'SRGO0020' OR MenuID = 'SRGO1020' OR MenuID = 'SRGO1030' OR MenuID = 'SRGO0010' OR MenuID = 'SRGO1060' OR MenuID = 'AMMN1070' OR MenuID = 'AMMN1060' OR MenuID = 'AMMN1050' OR MenuID = 'AMMN1040' OR MenuID = 'IMGO3013' OR MenuID = 'IMGO3013' OR MenuID = 'MPGO1016' OR MenuID = 'AMMN2001' OR MenuID = 'AMMN2003' OR MenuID = 'SRGO1210' OR MenuID = 'ASGO1200' OR MenuID = 'SRGO2110' OR MenuID = 'MMGO9510' OR MenuID = 'MMGO9520' OR MenuID = 'MMGO9530' OR MenuID = 'MMGO9050' OR MenuID = 'MMGO9700' OR MenuID = 'MMGO9720' OR MenuID = 'MMGO9750' OR MenuID = 'AMGO1520' OR MenuID = 'AMGO1530' OR MenuID = 'AMGO1500' OR MenuID = 'AMGO1510' OR MenuID = 'AMGO1560' OR MenuID = 'AMGO1540' OR MenuID = 'AMGO1550' OR MenuID = 'AMGO190' OR MenuID = 'AMGO1570' BY MenuDesc]]></parameter>
    <parameter name="pageSize" type="System.Int32"><![CDATA[0]]></parameter>
    <parameter name="absolutePage" type="System.Int32"><![CDATA[0]]></parameter>
    <parameter name="morePages" type="System.Boolean"><![CDATA[False]]></parameter>
  </parameters>
</tracePacket>

<tracePacket>
  <businessObject>Erp.Proxy.BO.LaborImpl</businessObject>
  <methodName>GetRows</methodName>
  <appServerUri>http://erp.gpcerp.com/E10Test/</appServerUri>
  <returnType>Erp.Tablesets.LaborTableset</returnType>
  <localTime>2/21/2023 15:56:10:1219953 PM</localTime>
  <threadID>1</threadID>
  <executionTime total="24" roundTrip="22" channel="0" bpm="0" other="2" />
  <retries>0</retries>
  <parameters>
    <parameter name="whereClauseLaborHed" type="System.String"><![CDATA[EmployeeNum = '56885' and ActiveTrans = yes BY EmployeeNum]]></parameter>
    <parameter name="whereClauseLaborDtl" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLaborDtlAttch" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLaborDtlComment" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLaborEquip" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLaborPart" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLbrScrapSerialNumbers" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLaborDtlGroup" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseSelectedSerialNumbers" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseSNFormat" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseTimeWeeklyView" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseTimeWorkHours" type="System.String"><![CDATA[]]></parameter>
    <parameter name="pageSize" type="System.Int32"><![CDATA[0]]></parameter>
    <parameter name="absolutePage" type="System.Int32"><![CDATA[0]]></parameter>
    <parameter name="morePages" type="System.Boolean"><![CDATA[False]]></parameter>
  </parameters>
</tracePacket>

<tracePacket>
  <businessObject>Ice.Proxy.BO.GenXDataImpl</businessObject>
  <methodName>GetByID</methodName>
  <appServerUri>http://erp.gpcerp.com/E10Test/</appServerUri>
  <returnType>Ice.Tablesets.GenXDataTableset</returnType>
  <localTime>2/21/2023 15:56:10:1579398 PM</localTime>
  <threadID>1</threadID>
  <executionTime total="24" roundTrip="24" channel="0" bpm="0" other="0" />
  <retries>0</retries>
  <parameters>
    <parameter name="company" type="System.String"><![CDATA[1001]]></parameter>
    <parameter name="productID" type="System.String"><![CDATA[EP]]></parameter>
    <parameter name="typeCode" type="System.String"><![CDATA[ProcessCallXReff]]></parameter>
    <parameter name="cgCCode" type="System.String"><![CDATA[]]></parameter>
    <parameter name="key1" type="System.String"><![CDATA[ProcessXrefCustom]]></parameter>
    <parameter name="key2" type="System.String"><![CDATA[]]></parameter>
    <parameter name="key3" type="System.String"><![CDATA[]]></parameter>
  </parameters>
</tracePacket>

<tracePacket>
  <businessObject>Erp.Proxy.BO.EmpBasicImpl</businessObject>
  <methodName>CheckShift</methodName>
  <appServerUri>http://erp.gpcerp.com/E10Test/</appServerUri>
  <returnType>System.Void</returnType>
  <localTime>2/21/2023 15:56:11:0337580 PM</localTime>
  <threadID>1</threadID>
  <executionTime total="21" roundTrip="20" channel="0" bpm="0" other="1" />
  <retries>0</retries>
  <parameters>
    <parameter name="ipEmpID" type="System.String"><![CDATA[3236]]></parameter>
    <parameter name="ipLaborShift" type="System.Int32"><![CDATA[3]]></parameter>
    <parameter name="opMessage" type="System.String"><![CDATA[]]></parameter>
  </parameters>
</tracePacket>

<tracePacket>
  <businessObject>Erp.Proxy.BO.EmpBasicImpl</businessObject>
  <methodName>ClockIn</methodName>
  <appServerUri>http://erp.gpcerp.com/E10Test/</appServerUri>
  <returnType>System.String</returnType>
  <localTime>2/21/2023 15:56:11:0676710 PM</localTime>
  <threadID>1</threadID>
  <executionTime total="34" roundTrip="33" channel="0" bpm="0" other="1" />
  <retries>0</retries>
  <parameters>
    <parameter name="employeeID" type="System.String"><![CDATA[56885]]></parameter>
    <parameter name="shift" type="System.Int32"><![CDATA[3]]></parameter>
  </parameters>
</tracePacket>

<tracePacket>
  <businessObject>Erp.Proxy.BO.LaborImpl</businessObject>
  <methodName>GetRows</methodName>
  <appServerUri>http://erp.gpcerp.com/E10Test/</appServerUri>
  <returnType>Erp.Tablesets.LaborTableset</returnType>
  <localTime>2/21/2023 15:56:11:7339574 PM</localTime>
  <threadID>1</threadID>
  <executionTime total="33" roundTrip="31" channel="0" bpm="0" other="2" />
  <retries>0</retries>
  <parameters>
    <parameter name="whereClauseLaborHed" type="System.String"><![CDATA[EmployeeNum = '56885' and ActiveTrans = yes BY EmployeeNum]]></parameter>
    <parameter name="whereClauseLaborDtl" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLaborDtlAttch" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLaborDtlComment" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLaborEquip" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLaborPart" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLbrScrapSerialNumbers" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseLaborDtlGroup" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseSelectedSerialNumbers" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseSNFormat" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseTimeWeeklyView" type="System.String"><![CDATA[]]></parameter>
    <parameter name="whereClauseTimeWorkHours" type="System.String"><![CDATA[]]></parameter>
    <parameter name="pageSize" type="System.Int32"><![CDATA[0]]></parameter>
    <parameter name="absolutePage" type="System.Int32"><![CDATA[0]]></parameter>
    <parameter name="morePages" type="System.Boolean"><![CDATA[False]]></parameter>
  </parameters>
</tracePacket>

<tracePacket>
  <businessObject>Ice.Proxy.BO.UserFileImpl</businessObject>
  <methodName>GetByID</methodName>
  <appServerUri>http://erp.gpcerp.com/E10Test/</appServerUri>
  <returnType>Ice.Tablesets.UserFileTableset</returnType>
  <localTime>2/21/2023 15:56:11:7679563 PM</localTime>
  <threadID>1</threadID>
  <executionTime total="93" roundTrip="92" channel="0" bpm="0" other="1" />
  <retries>0</retries>
  <parameters>
    <parameter name="userID" type="System.String"><![CDATA[99514.TMonty]]></parameter>
  </parameters>
</tracePacket>

<tracePacket>
  <businessObject>Erp.Proxy.BO.MESMenuImpl</businessObject>
  <methodName>GetMenuData</methodName>
  <appServerUri>http://erp.gpcerp.com/E10Test/</appServerUri>
  <returnType>Erp.Tablesets.MESMenuTableset</returnType>
  <localTime>2/21/2023 15:56:11:8621296 PM</localTime>
  <threadID>1</threadID>
  <executionTime total="80" roundTrip="80" channel="0" bpm="0" other="0" />
  <retries>0</retries>
  <parameters>
    <parameter name="empID" type="System.String"><![CDATA[56885]]></parameter>
    <parameter name="menuTypes" type="System.String"><![CDATA[M~X~]]></parameter>
  </parameters>
</tracePacket>


I was afraid of that. You’ve run into a situation where the empID is cached by the program.
It does that sometimes when the user is clocked in already. I haven’t been able to figure
out the exact behavior.

I was hoping you would not run into it the way you were using it.

The best move forward here would be a hybrid approach using a client customization.

The gist is, get fob id in MES, look up using the dynamic query adapter, replace the empid
before it ever goes out of MES.

Let me look at if it has a validation event or something we can build off of.
Worst case, we hide the empid text control, and use another one in front of it.

This should get you started on a client customization.
You’ll need to create a BAQ to return your Data.

Maybe touch up the validation rules etc. But this should just flow through.

If you need it for validation, don’t forget to pop in that string extension class at the bottom:

public static class StringExt
{
    public static bool IsNumeric(this string text)
    {
        double test;
        return double.TryParse(text, out test);
    }
}
// **************************************************
// Custom code for MESMenu
// Created: 2/21/2023 6:49:02 PM
// **************************************************
using System;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Windows.Forms;
using Erp.Adapters;
using Ice.Lib;
using Ice.Adapters;
using Ice.Lib.Customization;
using Ice.Lib.ExtendedProps;
using Ice.Lib.Framework;
using Ice.Lib.Searches;
using Ice.UI.FormFunctions;

using Ice.BO;
//Remember to add Ice.Contracts.BO.DynamicQuery.dll to references.
//Ice.Adapters.DynamicQuery.dll should already be added, but if not, add it too.

public class Script
{
	// ** Wizard Insert Location - Do Not Remove 'Begin/End Wizard Added Module Level Variables' Comments! **
	// Begin Wizard Added Module Level Variables **
	// End Wizard Added Module Level Variables **
	// Add Custom Module Level Variables Here **

	EpiTextBox txtEmployeeID1;

	public void InitializeCustomCode()
	{
		// ** Wizard Insert Location - Do not delete 'Begin/End Wizard Added Variable Initialization' lines **
		// Begin Wizard Added Variable Initialization
		// End Wizard Added Variable Initialization
		// Begin Wizard Added Custom Method Calls
		// End Wizard Added Custom Method Calls

		txtEmployeeID1 = (EpiTextBox)csm.GetNativeControlReference("fca2b60c-95cf-40b4-adc0-c168fc3a43fc"); //Appropriate GUID Here

		txtEmployeeID1.Validating += new System.ComponentModel.CancelEventHandler(txtEmployeeID1_Validating);
	}

	public void DestroyCustomCode()
	{
		// ** Wizard Insert Location - Do not delete 'Begin/End Wizard Added Object Disposal' lines **
		// Begin Wizard Added Object Disposal
		// End Wizard Added Object Disposal
		// Begin Custom Code Disposal
		// End Custom Code Disposal

		txtEmployeeID1.Validating -= new System.ComponentModel.CancelEventHandler(txtEmployeeID1_Validating);
	}

	private void txtEmployeeID1_Validating(object sender, System.ComponentModel.CancelEventArgs args)
	{
		EpiTextBox txtSender = (EpiTextBox)sender;

		if(txtSender.Text.Length == 5 && txtSender.Text.IsNumeric())
		{
			string fobID = txtSender.Text;

			using (var dynamicQueryAdapter = new DynamicQueryAdapter(MESMenu))
			{
				dynamicQueryAdapter.BOConnect();
				string baqGetRealID = "MyBAQFobLookupTable";

				QueryExecutionDataSet qeds = dynamicQueryAdapter.GetQueryExecutionParametersByID(baqGetRealID);
				qeds.ExecutionParameter.Clear();
				qeds.ExecutionParameter.AddExecutionParameterRow("FobID", fobID , "nvarchar", false, Guid.NewGuid(), "A");
				
				dynamicQueryAdapter.ExecuteByID(baqGetRealID, qeds);
			
				if(dynamicQueryAdapter.QueryResults.Tables["Results"].Rows.Count > 0)
				{
					txtSender.Text = dynamicQueryAdapter.QueryResults.Tables["Results"].Rows[0]["RealID"].ToString();
				}
				else args.Cancel = true;
			}
		}
	}
}

public static class StringExt
{
    public static bool IsNumeric(this string text)
    {
        double test;
        return double.TryParse(text, out test);
    }
}

So I created the query of all Fob IDs and EmpIDs

select 
	[EmpBasic].[EmpID] as [EmpBasic_EmpID],
	[EmpBasic].[BadgeID_c] as [EmpBasic_BadgeID_c],
	[EmpBasic].[EmpStatus] as [EmpBasic_EmpStatus]
from Erp.EmpBasic as EmpBasic
where (EmpBasic.EmpStatus = 'A')

And here is the code using your skeleton. I added the GUID to the text box.

// **************************************************
// Custom code for MESMenu
// Created: 2/21/2023 6:49:02 PM
// **************************************************
using System;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Windows.Forms;
using Erp.Adapters;
using Ice.Lib;
using Ice.Adapters;
using Ice.Lib.Customization;
using Ice.Lib.ExtendedProps;
using Ice.Lib.Framework;
using Ice.Lib.Searches;
using Ice.UI.FormFunctions;

using Ice.BO;
//Remember to add Ice.Contracts.BO.DynamicQuery.dll to references.
//Ice.Adapters.DynamicQuery.dll should already be added, but if not, add it too.

public class Script
{
	// ** Wizard Insert Location - Do Not Remove 'Begin/End Wizard Added Module Level Variables' Comments! **
	// Begin Wizard Added Module Level Variables **
	// End Wizard Added Module Level Variables **
	// Add Custom Module Level Variables Here **

	EpiTextBox txtEmployeeID1;

	public void InitializeCustomCode()
	{
		// ** Wizard Insert Location - Do not delete 'Begin/End Wizard Added Variable Initialization' lines **
		// Begin Wizard Added Variable Initialization
		// End Wizard Added Variable Initialization
		// Begin Wizard Added Custom Method Calls
		// End Wizard Added Custom Method Calls

		txtEmployeeID1 = (EpiTextBox)csm.GetNativeControlReference("fca2b60c-95cf-40b4-adc0-c168fc3a43fc"); //Appropriate GUID Here

		txtEmployeeID1.Validating += new System.ComponentModel.CancelEventHandler(txtEmployeeID1_Validating);
	}

	public void DestroyCustomCode()
	{
		// ** Wizard Insert Location - Do not delete 'Begin/End Wizard Added Object Disposal' lines **
		// Begin Wizard Added Object Disposal
		// End Wizard Added Object Disposal
		// Begin Custom Code Disposal
		// End Custom Code Disposal

		txtEmployeeID1.Validating -= new System.ComponentModel.CancelEventHandler(txtEmployeeID1_Validating);
	}

	private void txtEmployeeID1_Validating(object sender, System.ComponentModel.CancelEventArgs args)
	{
		EpiTextBox txtSender = (EpiTextBox)sender;

		if(txtSender.Text.Length == 5 && txtSender.Text.IsNumeric())
		{
			string fobID = txtSender.Text;

			using (var dynamicQueryAdapter = new DynamicQueryAdapter(MESMenu))
			{
				dynamicQueryAdapter.BOConnect();
				string baqGetRealID = "MES_FobID_EmpID";

				QueryExecutionDataSet qeds = dynamicQueryAdapter.GetQueryExecutionParametersByID(baqGetRealID);
				qeds.ExecutionParameter.Clear();
				qeds.ExecutionParameter.AddExecutionParameterRow("BadgeID_c", fobID , "nvarchar", false, Guid.NewGuid(), "A");
				dynamicQueryAdapter.ExecuteByID(baqGetRealID, qeds);
				
			
				if(dynamicQueryAdapter.QueryResults.Tables["Results"].Rows.Count > 0)
				{
//					txtSender.Text = dynamicQueryAdapter.QueryResults.Tables["Results"].Rows[0]["RealID"].ToString();
					txtSender.Text = dynamicQueryAdapter.QueryResults.Tables["Results"].Rows[0]["EmpID"].ToString();
				}
				else args.Cancel = true;
			}
		}
	}
}

public static class StringExt
{
    public static bool IsNumeric(this string text)
    {
        double test;
        return double.TryParse(text, out test);
    }
}

I am then getting this error.

Sorry if I plugged in the fields into the wrong spots of the code. This is the first time using a dynamic query adapter.

I didn’t actually make a query, so I’m not 100% positive if that’s how you pull it out :slight_smile: