How to configure Object Structure and Result Set portlet in Maximo

How to display related information of the record in portlet without SQL edit of start center? You can now configure a Result Set Portlet with attributes defined In the Object Structures.


For example:

1. Go to the Object Structures application.

2. Create an object structure to be used in the Result Set Portlet.

Object Structure application


3.  Go to the Report Administration application.

4. Click More Actions/Set Report Object Structure Security.

Report Object Structure Security

5. Now Create a new Result Set Portlet in the Start Center.

6. Click on the ‘Edit Portlet’ button.

Enter the Application/ Query saved in the Service Request application.
You can see the object list from the Report Object Structure created in Step 2 and you can choose attributes including any relationship attributes.

Start Center – Portlet setup
Portlet – result set

7. Once the Result Set Portlet configuration is complete, you can see the result like in the screenshot below.


WAS – remove maximo from context path

You can make your base web address to http://hostname/ instead of http://hostname/maximo using IBM HTTP server configuration, without restarting Maximo.

1. Open the WAS console–>Servers–>WebServers –>webserver1 .

2. Click the Edit button next to the httpd.conf file to edit the configuration file of the webserver.

3. Enable mod rewrite

Remove # in the line: LoadModule rewrite_module modules/mod_rewrite.mod
With removing # you enable this rewrite module.

4. Add the following at the end of the file config file:

RewriteEngine On
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^/$ /maximo/ [R=301,L]

5. Generate plugin, Propagate plugin and restart server.

Try now the address: http://hostname/ , and your Maximo login screen will welcome you.

Maximo – Auditing security groups and authorizations

The Security groups and application authorizations reports are aimed at providing a simple tool to have an high level view of how Maximo security groups are designed and how application authorizations are designed.


Security Overview report installation instructions

  1. Open the Administration > Report Administration application
  2. Create a new record and enter the following information:
    1. Report file name: mx_security.rptdesign
    2. Description: Security Security
    3. Application: SECURGROUP (Security Groups)
  3. Save the record
  4. Select Import Report action from the menu and in the Report Design File pick the mx_security.rptdesign file.
  5. Click on Generate Request Page and then on Preview button to run the report.

Application Security Overview report installation instructions

  1. Open the Administration – Report Administration application
  2. Create a new record and enter the following information:
    1. Report file name: mx_securityapp.rptdesign
    2. Description: Application Security Overview
    3. Application: SECURGROUP (Security Groups)
  3. Parameters:
    1. Parameter Name: securitygroup
    2. Attribute Name: GROUPNAME
    3. Lookup Name: birtsecuritygroups
    4. Display Name: Security Group
    5. Display Sequence: 1
    6. Multi-Lookup Enabled: Yes
  4. Save the record
  5. Select Import Report action from the menu and in the Report Design File pick the mx_securityapp.rptdesign file.
  6. Click on Generate Request Page and then on Preview button to run the report.

Report Information

  • The first report is called Security Overview and simply lists all the Security Groups and Start Centers counting how many users are assigned to them.
  • The second report is called Application Security Overview. It tries to represent which security groups provide access to applications.
  • The report lists all the applications in the rows and the security groups in the columns. The cell is yellow if read access is granted, orange if write access is granted, the number is the count of sigoptions granted.
  • The report can easily get too big if more than 20 security groups are defined so I decided to accept a list of security groups as filter so I can analyze smaller sets of data separately.

Maximo – Menu – Create a menu items:

A lof of changes, like this, cannot be made via application but via SQL.. damn you IBM.

1. Create a new Test Module


2. Create menus for Test module

The module has been created and now we need to put it into the correct position. Value of moduleapp is same as module from maxmodules.


btw: you must insert application into this module because empty module is not shown.

3. Attaching an application to the Test Module:



Functional example

Adding a newapplication View Incident in a new Incident Sub Module under Self Service Module.

Self Service ==> Incidents ==> View Incidents

values ('MODULE','SSDR',3230,0,'HEADER',null,'Incidents',NULL,1,'modimg_wo.gif', NULL,NULL,MAXMENUSEQ.NEXTVAL);

values ('MODULE','SSDR3',3230,10,'APP','VWINC',null,NULL,1,'modimg_wo.gif', NULL,NULL,MAXMENUSEQ.NEXTVAL);

Add SNM domain in maximo

The creation of domains is  very easy except the SYNONYM domain, so I made a little tutorial for me and you..

Path: Maximo menu -> System configuration -> Platofrm configuration -> Domains (its easy but hard to remember)

This typeof domain is a bit special so you are not able to make it by easiest way (Add a new Domain).. okay.. could be easier but..


At first there is table with basic fields of SNM domain:



Internal Value

Specify the internal value for which you want a synonym.

For example, in the STATUS domain, if you want to create a synonym for WAPPR called WAPPR, you would specify the WAPPR internal value.


Specify the synonym value you want a user to see.

For example, WAPPR.


Type a description of the synonym to differentiate it from the existing value.

In the Synonym Domain , the Internal Value is used by the system and must be unique. The Value and its description are what users see.

First step

Check if domain name does not exists

select * from MAXDOMAIN where domainid='%DOMAINID%'

Second step

Create snm domain as record in mxdomain table

insert into MAXDOMAIN (domainid,description,domaintype,maxtype,length,scale,maxdomainid,internal) VALUES ('SNM_TEST', 'test synonym domain','SYNONYM','UPPER', 16, 0, NEXT VALUE FOR MAXDOMAINSEQ,0)

Create a value for snm domain in syndom table


In this case we need a record with defined MAXVALUE , after that we are able to add any value with same MAXVALUE new by maximo web interface.

Maximo – Automation scripts – tips and examples

I’ve started to be working in Maximo project. This system has been developed by IBM but my user-experience with this solution is quite poor. Anyway I’ve found and customize few automation scripts in jython that are checking user’s input in Self Service Center offerings (in my case) but can be placed almost to every field. 

IP validation

# separated by dots (.)
#valid number between 0 255
errmsg = ''
rc = 1
ipList = newValue.split('.')
if len(ipList) == 4:
   for i in ipList:
         i = int(i)
         rc = 0
         errmsg = i, ' is not a valid number. IP Addresses must contain valid numbers'
      if i > 255:
         rc = 0
         errmsg = i, ' is greater than 255. Valid IP Addresses are between 0 and 255.'
   rc = 0
   errmsg = 'IP Addresses must be in the form nn.nn.nn.nn'
print rc
print errmsg

Ensure the end date is after the start date

#Check that end date comes after start date 
from java.text import SimpleDateFormat

fmt = SimpleDateFormat('MM/dd/yyyy')

rc = 1
errmsg = ''

# get the fields
startdatestr = offeringAttributes.getValue("STARTDATE");
enddatestr = offeringAttributes.getValue("ENDDATE");

# if both have values, format them, and ensure the enddate is after the start date
if len(startdatestr) > 0 and len(enddatestr) > 0:
startdate = fmt.parse(startdatestr)
enddate = fmt.parse(enddatestr)
if enddate.before(startdate):
rc = 0
errmsg = 'End Date must be greater than Start Date'

print rc
print errmsg

Create a string and set the value of one field, based on the value of another

#build and set the value of the server field based on the hostname field

property= offeringAttributes.getValue("HOSTNAME");
dhostname = newValue+'.'+property+''offeringAttributes.setNewValue("SERVER",server);
print True

Check if the entered value is a valid number

# make sure the value specified is all valid digits
rc = True
errmsg = ''
if newValue.isdigit() == False:
rc = False
errmsg = 'Value must be numeric'
print rc
print errmsg

Midtier – Custom login page

Sorry for delay, long hangover.. 

Default login page looks like an old-school and bmc provides a simple solution to complete remake. U can make whatever you want and use few required parameters are username, password and URL. Open mid-tier folder on your server and look in /shared/ for login.jsp and login_common.jsp You just need to use a POST method in the form.

Pages: 1 2

Remedy – Remove spaces from string

First rule – Never trust your users. Here is the tip to remove spaces from string.


Run-If: 'FIELD' LIKE "% "

Set-Field: zInt = LENGTH($FIELD$)

Set-Field: Field = SUBSTR($FIELD$,0,zInt-1)


Set-Field: Field = LTRIM(RTRIM($FIELD$))


Set-Field: REPLACE($FIELD$," ","")

In the end, it really depends on you. If you need remove all spaces use 2, in case of all spaces then 3.

Tabs as inline forms in console

After years of oldschool  and unuseable tabs I made a decision.. Design new tabs for console items.. Active links, Guides, Splitter Panels, ztmp fields, label changing and bit of jQuery. I’ve made limitation is 10 panels/tabs per console due the width of display. We are testing this solutions and seems like that users have better perfomance with multiple opened incidents in VFs than new browser windows.



PS: Disabled gradients and vertical panels get us better performance. (next time)