Tuesday, 5 May 2015

Automation Script - get difference between dates

If you want to get a difference between two dates in Maximo automation scripts, I tried below process:

For example:
In Work Order, you want to find a days between Target Start Date and Target Finish Date.

Target Start Date is "01/Apr/2015"
Target Finish Date is "25/Apr/2015"
Difference from Target Start Date and Target Finish Date is 25

Lets see how to write automation script:

Object: WORKORDER

Varibles declared as:

tsd = Target Start Date
tfd = Target Finish Date
dayselapsed = CUSTOM_DAYSELAPSED (Custom attribute to set days - integer)

Script as follows:

#************** AUTO SCRIPT START ***************
#Define a function to get date difference
#************** FUNCTION START ***************
def getDateDiff(timeDiff):

#Seconds in Millis
 milliseconds = 1000

#Minutes in Millis
 milliminutes = milliseconds * 60

#Hours in Millis
 millihours = milliminutes * 60

#Days in Millis
 millidays = millihours * 24

#Get days diff
daysDiff = timeDiff / millidays

#Get hours diff
hoursDiff = timeDiff/millihours

#Get minutes diff
minDiff = timeDiff / milliminutes


#Return days difference
if(daysDiff != 0):
 return int(daysDiff)

#Return hours difference
if(hoursDiff != 0):
 return int(hoursDiff)

#Return minutes difference
if(minDiff != 0):
 return int(minDiff )

#************** FUNCTION END ***************

#Time difference between two dates
timeDiff = tsd.getTime() - tfd.getTime()
daysDiffernce = getDateDiff(timeDiff)
dayselapsed = daysDifference

#************** AUTO SCRIPT END ***************

For few developers, if above script confuses you, below script without comments, to return days difference:

#************** AUTO SCRIPT START ***************
#Define a function to get date difference
#************** FUNCTION START ***************

def getDateDiff(timeDiff):
 milliseconds = 1000
 milliminutes = milliseconds * 60
 millihours = milliminutes * 60
 millidays = millihours * 24

daysDiff = timeDiff / millidays
hoursDiff = timeDiff/millihours
minDiff = timeDiff / milliminutes

if(daysDiff != 0):
 return int(daysDiff)

#************** FUNCTION END ***************

timeDiff = tsd.getTime() - tfd.getTime()
daysDiffernce = getDateDiff(timeDiff)
dayselapsed = daysDifference

#************** AUTO SCRIPT END ***************

 

Automation script integer variables

When I started writing a auto script to copy one INTEGER value into another INTEGER value, I feel that it is very easy to do. Offcourse it is easy, except you are able to solve the below error:

java.lang.ClassCastException: java.math.BigInteger incompatible with java.lang.String

I will explain you in detail, when you will face this error

For example, in work order I would like to set wopriority and assetlocpriority based on work type.

Created a attribute launch point script.

Variables declared as follows:

object is WORKORDER

wp = WOPRIORITY
alp = ASSETLOCPRIORITY
worktype = WORKTYPE

Script as follows:
#Script is for if work type is CM, then copy assetlocpriority to wopriority

if worktype == "CM":
 wp = alp

# Here you will get a error that
"java.lang.ClassCastException: java.math.BigInteger incompatible with java.lang.String"

This is because auto script considering these wp and alp as longs. I am not sure why it is like that and why it is throwing an error.
Hence I tried to print it.

print wp
#output is 2L
print alp
#output is 4L

From above output, I felt that, error is because of "L". Hence I tried to change to output without "L" like 2 and 4

So I did casting with integer like int(alp), it is printing output as "2" (without "L")

Corrected Script as follows:
#Script is for if work type is CM, then copy assetlocpriority to wopriority

if worktype == "CM":
 wp = int(alp)

Now it is working fine. No error.

 

Automation Script dates

To add DAYS to date:

For example, in Work Order we have target start date and target finish date:

now we will get the Target Start Date and Target Finish Date as variables tsd" and "tfd respectively.

In automation script, if we want to add two days to "Target Start Date" and copy it into "Target Finish Date"

# First import Calendar
from java.util import Calendar

#Create a Calendar instance
cal = Calendar.getInstance()

#Set calendar date as Target Start Date. Variable is defined in automation script as "tsd"
cal.setTime(tsd);
# ADD TWO DAYS TO TARGET START DATE
cal.add(cal.DATE,2)

#SUBSTRACT TWO DAYS TO TARGET START DATE
cal.add(cal.DATE,-2)

#ADD TWO WEEKS TO TARGET START DATE
cal.add(cal.DATE, 2*7)

#SUBSTRACT TWO WEEKS TO TARGET START DATE
cal.add(cal.DATE, -2*7)

#ADD 4 MONTHS TO TARGET START DATE
cal.add(cal.MONTH,4)

#SUBSTRACT 4 MONTHS TO TARGET START DATE
cal.add(cal.MONTH,-4)

#ADD 5 YEARS TO TARGET START DATE
cal.add(cal.YEAR,5)

#SUBSTRACT 5 YEARS TO TARGET START DATE
cal.add(cal.YEAR,-5)
#SET NEW DATE WITH INCREMENT/DECREMENT FROM CALENDAR TO TARGET FINSIH DATE
tfd = cal.getTime();



 

Maximo automation script mboset iteration

To iterate mboset records using automation script:

Usually we do below coding in java using Maximo API:

In the below example, taking PR as MboSet:

MboSetRemote prSet = MXServer.getMXServer().getMboSet("PR",MXServer.getMXServer().getSystemUserInfo());
prSet.setWhere("prnum = '"+<PRNUM>+"' and siteid = '"+<SITEID>+"'");
prSet.reset();

MboRemote pr = null;
int i = 0;

if(!prSet.isEmpty()){
  while((pr=prSet.getMbo(i)) != null){
      pr.setValue("description","TEST PR");
      i++;

     }
  prSet.save();
}

Now we will do above logic in Automation Script:



from psdi.server import MXServer

mxServer = MXServer.getMXServer()

prSet = mxServer.getMboSet("PR",mxServer.getUserInfo())
prSet.setWhere("prnum = '"+<PRNUM>+"' and siteid = '"+<SITEID>+"'")
prSet.reset()

prRemote= prSet.moveFirst()
while prRemote:
 prRemote= prSet.moveNext()

prSet.save()

Monday, 20 April 2015

Throw warning in Maximo Automation Script

To throw warning in automation script:

warning = MXApplicationException(msggroup, msgkey, msgparams);
mbo.getThisMboSet().addWarning(warning);



 

Throw error in Maximo Automation script

In Maximo, all messages like errors, warnings and info are available in maxmessages table with msgkey and msggroup.

To throw an error in autoscript:

errorgroup=<msggroup>
errorkey=<msgkey>

In case of parameters:
errorgroup=<msggroup>
errorkey=<msgkey>
params=[<param1>,<param2>...etc]

For example I have created an error message in maximo using database administration --> Messages

msggroup = TESTGRP
msgkey = TESTKEY
msgvalue = "This is a test message"

in automation script, it is easy to display error message by using below code:

errorgroup=TESTGRP
errorkey=TESTKEY

in case of params:

For ex: my message value has : msgvalue = "This is a test message by {0}"

errorgroup=TESTGRP
errorkey=TESTKEY
params=[user]


 

Maximo Automation Script - Create Action Launch Point

It is simple to create a action launch point.

In my case, I have created a sigoption in Purchase Order application.

1. Sigoption name is : CREATEPOEXT - by using app designer

In sigoption --> Advanced Signature Options --> select the radio button "This is an action that must be invoked by user in the UI"

Give the position in your select action menu in app designer.

Grant access to this sigoption in your security group applications.

2. Automation script

Go to System Configuration --> Platform Configuration --> Automation Script application
From list tab --> Select "Create" --> click on "Script with Action Launch Point"

Enter Launpoint name same as your sigoption created for your application:
Launpoint : CREATEPOEXT
Active: Yes
Object: PO
Action: CREATEPOEXT
Note: Action name will auto generate same as launch point name.
Click next and enter your variables and automation script. Save the record. That's it.

3. Main point is, you don't have to create a Action separately in Actions applications.
for ex: Action "CREATEPOEXT" automatically created in Action applications.

Action will be created like below, in our case:

Action: CREATEPOEXT
Object: PO
Type: Custom Class
Value: com.ibm.tivoli.maximo.script.ScriptAction
Note: Above value is common class for all action launch point related actions.
Parameter: CREATEPOEXT,CREATEPOEXT,CREATEPOEXT
In parameter, you noticed that there are three values. Let me explain what are they
1. Script name
2. Launch point name
3. Action name
in my case all names are "CREATEPOEXT"

So by any chance, if you miss any of those values in your "parameter" field of action, then it will throw error at the point of automation script execution.

 

Maximo SOAPUI error javax.xml.ws.WebServiceException

SOAPUI error while sending payload to below url (in cluster environment) http://localhost:9080/meaweb/services/MXASSET Error : <f...