Delete WHS Mobile Device Portal User Session in AX2012
To test the “new” WHS Mobile Device Portal in AX 2012 R3, one can use the WHSWorkExecute form (a nifty WMDP emulator). But while creating a new form inside the WMDP, I managed it to get stuck in a blank form, with no way out.
On top it seems like the actual session is saved in the WHSWorkUserSession table and even after logoff / logon the blank form comes up. So I created a small dialog to reset the user data, like in my post about creating a custom lookup.
TLDR: Delete the line realated to your WHSUserId in the WHSWorkUserSession table, to completly reset your user session.
First we create a new class which extends RunBase.
Declaration:
class WHSUserSession extends RunBase | |
{ | |
DialogField fieldWHSUserId; | |
} |
Methods:
Next we add a main method, create a new object of the class and call a method (resetUserSession()), which we will create in a second.
static void main(Args args) | |
{ | |
WHSUserSession userSession = new WHSUserSession(); | |
if (userSession.prompt()) | |
userSession.resetUserSession(); | |
} |
Then we add the dialog() method where we get the WHSUserId and also getting the control to finally override the lookup().
The WHSUserId is the UserId we want to reset later.
protected Object dialog() | |
{ | |
Dialog dialog; | |
FormStringControl control; | |
dialog = super(); | |
dialog.caption("WHS: Reset user session"); | |
fieldWHSUserId = dialog.addField(extendedTypeStr(WHSUserId), "Select User"); | |
control = fieldWHSUserId.control(); | |
control.registerOverrideMethod(methodStr(FormStringControl, lookup), | |
methodStr(WHSUserSession, lookup), this); | |
return dialog; | |
} |
Now we add the lookup to choose the UserId, I added the InventLocationId and the LastActionDateTime, to better distinguish the entries.
public void lookup(FormStringControl _control) | |
{ | |
Query query = new Query(); | |
QueryBuildDataSource queryBuildDataSource; | |
SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(WHSWorkUserSession), | |
_control); | |
sysTableLookup.addLookupField(fieldNum(WHSWorkUserSession, UserId)); | |
sysTableLookup.addLookupField(fieldNum(WHSWorkUserSession, InventLocationId)); | |
sysTableLookup.addLookupField(fieldNum(WHSWorkUserSession, LastActionDateTime)); | |
queryBuildDataSource = query.addDataSource(tableNum(WHSWorkUserSession)); | |
sysTableLookup.parmQuery(query); | |
sysTableLookup.performFormLookup(); | |
} |
At least we add the resetUserSession(). We just use the value from the lookup and search the entry in the WHSWorkUserSession table, if we find a line, we are trying to delete the session and commit the changes.
private void resetUserSession() | |
{ | |
WHSWorkUserSession workUserSession; | |
if (fieldWHSUserId.value()) | |
{ | |
workUserSession = WHSWorkUserSession::find(fieldWHSUserId.value(), true); | |
if (workUserSession) | |
{ | |
try | |
{ | |
ttsBegin; | |
if (workUserSession.validateDelete()) | |
workUserSession.delete(); | |
else | |
throw Exception::Error; | |
ttsCommit; | |
} | |
catch (Exception::Error) | |
{ | |
error(strFmt("Could not delete user session data for userId %1", | |
workUserSession.UserId)); | |
} | |
} | |
else | |
error(strFmt("UserId %1 not found!", | |
fieldWHSUserId.value())); | |
} | |
} |
Reset the WHS User Session in action:
This it what it looks like, if one hit OK, the WHS work user session will be deleted.