Handheld Change Workstation

Does anyone have any ideas on the best approach for a change workstation option on the handheld?

I was thinking a button on the menu to instigate a list to select from.

Logout an change login from HH01 to HH02 or HH03 :slight_smile:

Maybe I’m just confusing myself. Here is the scenario. Employee is linked to a user account, user account is linked to workstation that has a default label printer. User is out in the yard with his handheld and was picking and packing and printing pack labels on printer A. They are now told to go to receiving to receive stock and label the received stock, which would be printed on printer B.

Are you saying just don’t populate the user name in the employee production form and then have multiple epicor users with different workstations?..Looks like you might be onto something… Just tested creating a new user with a different workstation the original with no workstation and, nothing in the employee and two RDS connections with the different user accounts that and it one prints and the other doesn’t which is what we need, not as clean as being able to change workstation on the fly, but it gives us the result.

No doubt there would be a way to add a button and call the change workstation form. Interestingly the dimensions are not far off our standard handheld screen.

Thanks @hkeric.wci

Here’s a trace when I open the change workstation form.

Expand to show full trace

<tracePacket>
  <businessObject>Ice.Proxy.Lib.ClassAttributeImpl</businessObject>
  <methodName>GetAttributes</methodName>
 

 <appServerUri>net.tcp://<your app server here>/EpicorERPTest/</appServerUri>
  <returnType>Ice.Tablesets.ClassAttributeTableset</returnType>
  <localTime>14/03/2019 12:26:53:8898445 PM</localTime>
  <threadID>1</threadID>
  <executionTime total="34" roundTrip="30" channel="0" bpm="0" other="4" />
  <retries>0</retries>
  <parameters>
    <parameter name="classNames" type="System.String"><![CDATA[Workstation]]></parameter>
    <parameter name="nameSpace" type="System.String"><![CDATA[Erp.BO]]></parameter>
  </parameters>
</tracePacket>

<tracePacket>
  <businessObject>Ice.Proxy.Lib.ClassAttributeImpl</businessObject>
  <methodName>GetAttributes</methodName>
  <appServerUri>net.tcp://<your app server here>/EpicorERPTest/</appServerUri>
  <returnType>Ice.Tablesets.ClassAttributeTableset</returnType>
  <localTime>14/03/2019 12:26:53:9368434 PM</localTime>
  <threadID>1</threadID>
  <executionTime total="26" roundTrip="24" channel="0" bpm="0" other="2" />
  <retries>0</retries>
  <parameters>
    <parameter name="classNames" type="System.String"><![CDATA[Workstation]]></parameter>
    <parameter name="nameSpace" type="System.String"><![CDATA[Erp.BO]]></parameter>
  </parameters>
</tracePacket>

<tracePacket>
  <businessObject>Erp.Proxy.BO.WorkStationImpl</businessObject>
  <methodName>GetList</methodName>
  <appServerUri>net.tcp://<your app server here>/EpicorERPTest/</appServerUri>
  <returnType>Erp.Tablesets.WorkstationListTableset</returnType>
  <localTime>14/03/2019 12:26:53:9638476 PM</localTime>
  <threadID>1</threadID>
  <executionTime total="15" roundTrip="14" channel="0" bpm="0" other="1" />
  <retries>0</retries>
  <parameters>
    <parameter name="whereClause" type="System.String"><![CDATA[ BY WorkStationID]]></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.Lib.ClassAttributeImpl</businessObject>
  <methodName>GetAttributes</methodName>
  <appServerUri>net.tcp://<your app server here>/EpicorERPTest/</appServerUri>
  <returnType>Ice.Tablesets.ClassAttributeTableset</returnType>
  <localTime>14/03/2019 12:26:53:9788416 PM</localTime>
  <threadID>1</threadID>
  <executionTime total="27" roundTrip="23" channel="0" bpm="0" other="4" />
  <retries>0</retries>
  <parameters>
    <parameter name="classNames" type="System.String"><![CDATA[Workstation]]></parameter>
    <parameter name="nameSpace" type="System.String"><![CDATA[Erp.BO]]></parameter>
  </parameters>
</tracePacket>

<tracePacket>
  <businessObject>Ice.Proxy.Lib.SessionModImpl</businessObject>
  <methodName>SetWorkstation</methodName>
  <appServerUri>net.tcp://<your app server here>/EpicorERPTest/</appServerUri>
  <returnType>System.Void</returnType>
  <localTime>14/03/2019 12:26:57:4714094 PM</localTime>
  <threadID>1</threadID>
  <executionTime total="71" roundTrip="30" channel="39" bpm="0" other="2" />
  <retries>0</retries>
  <parameters>
    <parameter name="newWorkstationID" type="System.String"><![CDATA[PACK]]></parameter>
    <parameter name="workstationDescription" type="System.String"><![CDATA[]]></parameter>
  </parameters>
</tracePacket>

Thats pretty much how everyone has been doing it thus far. You assign a Handheld to a Station / Plant. Then they login with a Generic User HH01 let’s say for Receiving and it will prompt them for their Employee ID but that Employee has no UserID Link.

Same like MES Stations. We have Forklift drivers, jump off and use any MES Station they want, but then their Labels Print back in Shipping because their ID is tied to that Printer. So the rule always is, use the proper Workstation.

Then you tie the Devices to HH01 and HH02 etc… I know it’s not as practical, but thats what Epicor has been preaching.

I retested that today and yes that is how I have it setup now. Logging out and back in is a bit of a pain to be honest, particularly where you have the same person preforming different tasks in different areas. There is a lot to be said
for portable label printers.

Being able to swap workstations in the app would have resolved this issue and save the additional admin of setting up extra AD users and tieing them to specific workstations.

C’est la vie.

On to more interesting things like playing with Mycoft.

You could add a Menu Item to the HH Menu and then switch in there… It is possible. Just not ouf of the Box :slight_smile:

I was thinking of that, but just was not sure on the best approach.

The only thing I guess a HH Menu that Opens up a UD20 screen for example and then you have dropdown and a button. As Simple as Possible.

You can do this.oTrans.Session.SetPlantID(“12334”); and it will swtich it or even change users in there with .SetUserID(…);

SetCompanyID(CompanyID).SetPlantID(PlantID).SetUserID(UserID).SetEmployeeID(EmployeeID)

If I recall you can even do SetWorkstation - Perhaps just make a Workstation Switcher.

1 Like

I agree with that. How about a dashboard and the change on the row select?

@Chris_Conn did some heavy research on the HH Menu and struggled with it, I wonder if he can give you a boiler plate code.

I did heavy customization to the way workstation printing worked, this was mainly in MES, not HH though. With that said, the same approach could be applied.

The crux of the whole thing was avoiding using AutoPrint (with Bartender) and instead, writing my own logic to generate the BT files. That opened up a huge amount of flexibility, and ultimately, I made it such that the selected printer would default based on the workstation, but the user had the entire selection of (label) printers at their disposal. That way, if my forklift was on the otherside of the building, I could look at the name tagged on the side of the printer (could even barcode and scan) to select the proper printer.

Also, the user had the ability to set copies, reprints, etc.

2 Likes

I’ve got labels working as custom code bpms, I ended up testing for the assembly as we had specific labels based on customer forms, so that works, I’ve also added a menu based on some of your direction in other posts. I’m thinking Iight ba able to advance button to the menu to drive the workstation change, but at least we have the fallback of multiple AD users… @Chris_Conn sounds like you were in the same situation as us, not having the numbers of employees to only perform only one part of the process as Epicor expects.
Thanks for the advice, and suggestions.

Not sure if it can be done…but probably can:

var ses = ((Ice.Core.Session)oTrans.Session);
ses.WorkstationID = "MyDesiredWorkStation";

Make a screen to display all WorkStations and Associated printers.
When user selects one, try to set the workstation in the current session.
Print to your newly selected printer

1 Like

This is my attempt. Created a simple BAQ/Dashboard with a tracker deployed, added a button to the assembly as a customisation, Modified the Erp.Menu.Handheld to add a new button and label so show the workstation. Then used the process calling example to tell the menu that the form has workstation was changed, then just @Chris_Conn/@hkeric.wci code to refresh the Workstation label.

Dashboard is a bit clunky but it appears to work. Just need to check the prn parameter in the bartender reports to confirm it is picking things up correctly, but I think it will be.

HHChangeWorkstation

Thanks again for all the advice and historical posts.

Also meant to mention theirs a setButtonImage method in the Erp.Menu.Handheld assembly

5 Likes

Looks very good! Nice work… Someone tag Epicor to Learn from it :slight_smile: hehe

What image did you use for setButtonImage? for that Monitor

@Hally you are violating the Golden Rule… That those who help get the source code. :smiley: Right @Chris_Conn

1 Like

Full steps to replicate will come in due course :grin:. Thought I might make it “A one way to do it” how to… Was going to put it in code review, I’m sure there are some refinements that can be made, but for a first attempt I was chuffed it worked pretty much first go!

On the menu the new button I added for the workstation (second button from the bottom)

Any thoughts on using Bluetooth/iBeacon to find the closest printer? You can buy USB BLE Beacons for about $30.

1 Like