March 29, 2012

Cloning Maximo environment

There are many reasons why it is useful sometimes to overwrite a development, test or training system with all the data and customizations from the production system. These are just few examples:
  • Development systems has become dirty after some customization that have not been moved to production.
  • Fresh data is needed on the test system to reproduce a problem and perform troubleshooting.
  • Fresh data is needed on the development system to develop new features.
The procedure described hereafter is not intended to replace the functionality of the Migration Manager especially when promoting customizations from test to production. Furthermore, the procedure assumes that dev, test and prod systems have the same version of Maximo installed and runs the same OS.

Here is the procedure. This is not an official IBM TechNote. Use at your own risk.
UPDATE: IBM has now released a more accurate procedure.


Clone the database
  • Backup the source Maximo database.
  • Backup the target Maximo database (this step is optional but suggested as a precautionary measure).
  • Restore the source backup into the target database.
To perform this steps you can use the built in features of your RDBMS or try to use the unlcvt command described in this post.


Reset passwords

Reset users password to be able to login with every account as needed.

update MAXUSER set PASSWORD = (select PASSWORD from MAXUSER where USERID='maxadmin');


Security

Disable AppServerSecurity. This may be needed sometimes when production system uses LDAP authentication.
update MAXPROPVALUE set PROPVALUE='0' where PROPNAME='mxe.useAppServerSecurity';


Hostname

Update the hostname in the database.
update MAXPROPVALUE set PROPVALUE='[NEWHOSTNAME]' where propname='mxe.hostname';
update MAXPROPVALUE set PROPVALUE='http://[NEWHOSTNAME]/meaweb' where PROPNAME='mxe.int.webappurl';

There are other variables that should be changed as well like WAS.WebServerHostName and WAS.DeploymentManagerHostName.


Database connection

Typically database connection properties are stored into maximo.properties file. However, these are also stored in the Maximo database and used for installation of fixpacks and patches.
update MAXPROPVALUE set PROPVALUE='[DBURL]' where propname='mxe.db.url';
update MAXPROPVALUE set PROPVALUE='[DBHOST]' where PROPNAME='Database.SQL.ServerHostName';

There are other variables that should be changed as well like WAS.WebServerHostName and WAS.DeploymentManagerHostName.


Emails

Replace all user's email addresses with your email. This may be useful to test workflow or escalations emailing.

update MAXPROPVALUE set PROPVALUE='mymail@dummy.com' where PROPNAME='mxe.adminEmail';
update MAXPROPVALUE set PROPVALUE='mymail@dummy.comm' where PROPNAME='mxe.workflow.admin';
drop index email_ndx2 on EMAIL;
update EMAIL set EMAILADDRESS='mymail@dummy.com';

If you have automated emailing to vendors or users may prefer to disable emailing completely to avoid spamming from test systems.

update MAXPROPVALUE set PROPVALUE='dummysmtp' where PROPNAME='mail.smtp.host';


MIF home dir (optional)

Update MIF home directory if needed

update MAXPROPVALUE set PROPVALUE= 'C:\MIFDIR' where PROPNAME='mxe.int.globaldir';


Disable crontasks (optional)

You may want to disable all the crontasks to avoid escalations, integrations, emailing or whatever automated system you have in place.

update CRONTASKINSTANCE set ACTIVE = 0;
update INBOUNDCOMMCFG set ACTIVE = 0;

Commit changes

Don't forget to commit your updates :-)


Overwrite Java code
  • Backup the SMP\maximo\applications\maximo on the target system.
  • Copy maximo.ear file from the source system to a temp directory on the target system.
  • Extract the maximo.ear file.
  • Extract businessobjects.jar file.
  • Replace the content of [SMPDIR]\maximo\applications\maximo\businessobjects directory with the extracted businessobjects.jar file.
  • Replace the content of [SMPDIR]\maximo\applications\maximo\maximouiweb\webmodule\WEB-INF\classes directory with the code from the extracted maximo.ear file.
  • Replace any other sources that you may have modified on the target system.


Update maximo.properties

Open the maximo.properties text file located under [SMPDIR]\maximo\applications\maximo\properties folder and update mxe.db.url and other properties according to the new environment.
If the file is encrypted refer to this IBM TechNote to modify it.


Redeploy Maximo EAR
  • Build Maximo EAR launching [SMPDIR]\maximo\deployment\buildmaximoear.bat script (or buildmaximoear.sh)
  • Deploy the Maximo EAR file using the WAS Console.
  • Start the application server.
  • Check SystemOut.log to ensure there aren’t any problem.
 
References

March 22, 2012

Maximo Inventory explained

Check out the this TechNote from IBM about Maximo inventory management.
Another interesting resource is the Understanding Maximo Asset Management inventory reorder calculations video. The same presentation is available in PDF format.

March 19, 2012

Brief history of Maximo, TPAE, TAMIT, CCMDB, TSRM

In today's post I want to share with you a brief history of Maximo and how it relates with many other IBM products TAMIT, CCMDB, TSRM.

Maximo is the product name introduced in early 1990's that was then classified as Computerized Maintenance Management Software or CMMS, by Project Software Development, Inc. (PSDI) During the Dot Com era the company change name to MRO Software as a recognition to the decline of the original Project Software, to the ascendancy of the Maximo product. It was at this time that MRO acquired Main Control and it's ITAM product knowledge. That was the beginning of the Eagle project. The merging of ITAM and EAM started. It was though that in one product the functions for service desk, IT Asset Management, and traditional Asset Management could be performed. Welcome to Maximo v6.

The functional capabilities for TAMIT and TSRM were provisioned separately in version 6.2. This was more than just marketing and licensing. Actual feature functionality was turned on or off depending on those licenses. This was the beginning of the division of the various products into truly different product offerings all built on the Tivoli Process Automation Engine (TPAE). Version 7.1 and 7.2 of Maximo Enterprise Asset Management (EAM), TSRM as well as TAMIT, and CCMDB are all built on the exact same platform with a variety of differences including additional persistent and non-persistent objects, encoded business logic (i.e. class files), as well as content to enable automated business processes.

Version 7.5 now performs a very important function of providing better synergy and consistency in business processes across the various products. This allows clients to ostensibly use the same instance with much more efficient use of the software, and better visibility and control for all assets managed and maintained by the various product based on the original Maximo product.

March 16, 2012

Find all references to a conditional expression

This entry is part of the Conditional Expressions HowTo.

Conditional expressions are one of the most powerful tool in the hand of a skilled TPAE specialist. However, when things get complex it may be hard to track where all custom conditional expression are referenced in your environment. That's why I have spent some minutes developing a small set of SQL queries to list those references from the TPAE database.
First of all, conditional expressions are stored in the CONDITION table. The other tables that has reference to this table are:
  • CTRLCONDITION/CTRLGROUP
  • APPLICATIONAUTH
  • SECURITYRESTRICT
  • MAXDOMVALCOND
  • CROSSOVERDOMAIN
Let's look at all these tables one by one.

CTRLCONDITION/CTRLGROUP

Conditional Expressions can be used into Application Designer through the 'Configure Conditional Properties' button. These conditions can then be used to set specific properties to a UI control.

SELECT ctrlgroup.app, ctrlgroup.optionname, ctrlgroup.groupname, ctrlcondition.conditionnum
FROM ctrlcondition 
JOIN ctrlgroup ON ctrlgroup.ctrlgroupid=ctrlcondition.ctrlgroupid
JOIN condition ON condition.conditionnum=ctrlcondition.conditionnum
WHERE ctrlcondition.conditionnum IS NOT NULL;

APPLICATIONAUTH

Applications SigOptions can be activated upon the evaluation of a Conditional Expression (see Security - Security Groups - Applications)
The following query will list all the SigOption with a bounded conditional expression together with all the applications and groups.

SELECT a.app, a.groupname, a.optionname, a.conditionnum, c.expression, c.type
FROM applicationauth a
JOIN condition c ON a.conditionnum=c.conditionnum
WHERE a.conditionnum IS NOT NULL;

If you are not interested in which group has access to a specific SigOption the following query returns a much shorter list.

SELECT a.app, a.optionname, a.conditionnum, c.description, c.expression, c.type
FROM applicationauth a
JOIN condition c ON a.conditionnum=c.conditionnum
WHERE a.conditionnum IS NOT NULL
GROUP BY a.app, a.optionname, a.conditionnum, c.description, c.expression, c.type;

After having identified the SigOption, you can check the application presentation XML to find the linked control.

SECURITYRESTRICT

Security restrictions can be applied to an object or an attribute and can be linked to a Conditional Expression (see Security - Security Groups - Select Action Menu - Global Data Restrictions)

select * from SECURITYRESTRICT;

MAXDOMVALCOND

Conditions can be set on crossover domains (see System Configuration - Platform Configurations - Domains - ALN Domain)

SELECT * FROM maxdomvalcond WHERE conditionnum IS NOT NULL;

CROSSOVERDOMAIN

Conditions can be set on crossover domains (see System Configuration - Platform Configurations - Domains - Crossover Domain

SELECT * FROM crossoverdomain WHERE conditionnum IS NOT NULL;

March 14, 2012

Get ready for IBM Smart Cloud Control Desk 7.5

Upcoming IBM® SmartCloud Control Desk unifies CCMDB, TSRM and TAMIT in a single solution with a flexible licensing model.

IBM® SmartCloud Control Desk V7.5 provides:
  • Automated process control required to keep up with the rapid changes that cloud brings about
  • New licensing model 
  • New delivery models that include a Software as a Service (SaaS) model
  • New asset and configuration item (CI) integrations and linkages 
  • New navigation capabilities throughout the product 
  • Improved performance throughout 
  • Simplified intuitive interfaces throughout the product 
  • New Catalog entry creation mechanism and usability improvements

IBM SmartCloud Control Desk V7.5 is a new and unified way to provide critical
service functionality. It delivers a single solution for service catalog, request
management, and Information Technology Infrastructure Library (ITIL) V3 based
processes of incident, problem, change, configuration, release management,
and IT asset management across complex IT landscapes. With IBM SmartCloud
Control Desk, you get a comprehensive software and asset lifecycle management
solution including requisition, procurement, inventory, deployment, and contract
management.

March 13, 2012

How to hide a field using conditional expressions

This entry is part of the Conditional Expressions HowTo.

In this little tutorial, I will show how to dynamically hide the Total Cost field in the PR Lines tab of the Purchase Requisitions (PR) application for the PRs that are in status APPR. This is just an example and the same configuration can be used to hide or show any field based on a particular condition.

Define conditional expression

Open Administration - Conditional Expression Manager application. Create the following conditional expression.
  • Condition: PRAPPR
  • Description: Status is APPR
  • Type: EXPRESSION
  • Expression: :status='APPR'
  • Always Evaluate: true


Configure PR application

Open System configuration - Platform Configuration - Applications Designer application and edit the PR application. Select the Total Cost field in the upper right corner of the PR Lines tab and open the properties window. Click on Configure Conditional Properties button (on TPAE 7.5 it is in the Advanced tab) and configure it as follows.

  • Signature Option: READ 
  • Security Group: EVERYONE
  • Condition for Security Group EVERYONE: PRAPPR
  • Property values when condition PRAPPR is true: Property=display - Value=false

Here is how the Conditional Properties properties should look like.


Save the PR application and open the Purchase Requisition application.
Now for all the PRs in APPR status the Total Cost field in the PR Lines tab will be hidden.

March 12, 2012

Analyze BIRT report performances and execution time

Some days ago I came across this interesting post from Pam Denny that describes the 80/20 rule. Based on this empirical rule 80% of the report processing is done by only 20% of used reports.
That's why I developed a simple SQL query that uses the LASTRUNDURATION field of the REPORT table to list the report that have the longest execution time.

SELECT lastrunduration, reportname, description, appname, lastrundate
FROM report
WHERE lastrunduration IS NOT NULL
ORDER BY lastrunduration DESC

Running this query on a real Maximo production database I got the following figure.


This diagram is very interesting because it perfectly confirms the validity of the 80/20 rule.
The problem with the previous query is that it considers only the last execution time of each report. However, there is an interesting hidden table called REPORTUSAGELOG that stores some basic statistics of all report executions.
With this table we can calculate the average execution time of all the available reports.

SELECT AVG(enddate-startdate)*24*60, reportname
FROM reportusagelog
GROUP BY reportname
ORDER BY AVG(enddate-startdate) DESC

This new query spotted a specific report which average execution time is 106 minutes.


Once you have identified the troubled reports you can start to analyze the performance issues.
This post describes the technique I typically use: Troubleshooting Birt report performances.

More insights on this topic can be found here.


Maximo Health Check report

To help troubleshoot performance issues in Maximo I have also developed the Maximo Health Check report . Report performances, database size, crontasks/escalations execution times and much more information are reported in a single report.

March 11, 2012

How to change the color of a field using conditional expressions

This entry is part of the Conditional Expressions HowTo.

Here is a step-by-step guide about how to dynamically highlight workorders that have a high priority in the WOTRACK application. This is just an example and the same configuration can be used to change the color of a field based on a particular condition.

Define conditional expression

Open Administration - Conditional Expression Manager application. Create the following conditional expression.

Configure WOTRACK application

Open System configuration - Platform Configuration - Applications Designer application and edit the WOTRACK application. Select the first column (Work Order) and open the properties window. Click on Configure Conditional Properties button (on TPAE 7.5 it is in the Advanced tab). Use READ as Signature Option and EVERYONE as the security group. Enter the defined condition WOHIPRI with Property=cssclass and Value=bgred. For a list of all the properties available for each control please refer to this document.
Here is how the Conditional Properties properties should look like.


Verify results

Now all the work orders with a priority equal to 1 will be highlighted in red.




March 9, 2012

Query users and groups security

Did you have ever spent precious time searching in the Group Security application what group grants a specific permission to a certain user?
Do you want to list all the sigoption granted to a specific user?
Do you want to list all the groups to which a specific user belongs together with all the granted sigoptions?
Do you want to know who has access to a specific application or sigoption?
Here is a SQL query that may help you. It joins several tables and allows to answer all the previous questions... and many more.

SELECT
  groupuser.userid,
  maxgroup.groupname,
  sigoption.app,
  sigoption.description sigoptiondesc
FROM groupuser
JOIN maxgroup ON maxgroup.groupname=groupuser.groupname
JOIN applicationauth ON applicationauth.groupname=maxgroup.groupname
JOIN sigoption ON sigoption.optionname=applicationauth.optionname AND sigoption.app=applicationauth.app
WHERE sigoption.app='YOURAPP' AND sigoption.description='YOURSIGOPTION' AND groupuser.userid='YOURUSER'
ORDER BY groupuser.userid;

By changing the where and the order by clauses you can analyze your user's and group security settings.

March 3, 2012

Search for NULL values in Maximo applications

Today I want to share with you a little tip that allows to search for empty (NULL) values in every Maximo/TPAE application.
You can search for null and not null values by entering the following values into a search field on the Find tab:
  • To search for a null value enter: ~null~
  • To search for not null values enter: != ~null~

If your keyboard does not have the tilde '~' character you may type enter this character by typing 126 on your numeric keypad while pressing the 'Alt' key.
Maybe this sound obvious to you but it was not easy to discover...