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?
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.
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 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?
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
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
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.
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);
}
}