Saturday, November 29, 2025

Maximo 7.6 vs MAS 9 – Key differences in Deployment & Administration

 

Upgrade from Maximo 7.6 to MAS 8 or MAS 9 has not only brought new application features, but also the way it is deployed.

Here are few major differences.

Feature

Maximo7.6, Earlier versions

MAS 8, MAS 9 or Later version

Platform

Hosted via IBM WebSphere or Oracle Weblogic.

Hosted via Redhat openshift

Installation

Maximo is first installed then Maximo ear is deployed in WebSphere

MAS 9 is installed via operator hub in Redhat openshift

Required Separate installation of IBM WebSphere

IBM Liberty is embedded with Maximo Manage image

 - No need to configure separate server

Services

Maximo services were identified as application servers or JVMs.

Maximo services are run as pods or containers

Grouping of services:

Set of JVMs to handle different Maximo services such as Cron, Reporting, UI etc.

Logical grouping of pods

to handle different Maximo services such as Cron, Reporting, UI etc.

Logging:

SystemOut.log at JVM level

Logs recorded at pod level

Hosting:

Environment - Virtualhosts - Hostnames

Networking - Routes - Hostnames

Configuration files:

XML

YAML

Certificates

Configured at WebSphere

Configured at Maximo Manage

Saturday, October 4, 2025

Retrieving attachments from S3 Bucket

  • Retrieving a file from doclinks is straightforward. We can pass the doclink URL to ‘File’ object as shown below.
                    file=File("docklink-filepath")
  • However, if the attachments are using an S3 bucket, then we cannot directly fetch ‘File’ object from URL.
  • Few additional steps are required to convert as file before sending or uploading to an API
Steps:
  • Get the byte array of attachment from S3 bucket
  • Create a temporary file in server or pod
  • Create ‘File-output stream’ of the temporary file
  • Write the byte array into the ‘File-output stream’.
  • Upload the ‘File-output stream’ to REST API to send as file attachment.
  • Delete the temporary file

Source Code:

from com.ibm.tivoli.maximo.cos import COSApi
from java.io import File, FileOutputStream, FileInputStream
from java.net  import URL, HttpURLConnection;
from org.apache.http.entity.mime import MultipartEntityBuilder;

cosApi = COSApi(False)
bucketname = service.getProperty(mxe.cosbucketname)
urlString = filePath.split()
fileName = urlString[-1]

#Create Temporary File in Pod
FILEPATH = "root\maximo\temp\fileName.txt";
uploadFile =  File(FILEPATH);
uploadFile.createNewFile();
fos = FileOutputStream(uploadFile);

## Option - 1 

#Get byteArray from S3 Bucket
docBytes=cosApi.getFile(bucketname,fileName)

# Write the Bytes to File Outputstream
fos.write(docBytes);
print(Successfully+  byte inserted);
# Close the file connections
fos.close();

'''
## Option - 2
# Get Input Stream from s3 bucket
fis=cosApi.streamFile(bucketname,fileName)

byteRead=0
#Read byte by byte
while ((byteRead = fis.read()) != -1)
    #Write byte by byte
    fos.write(byteRead)
'''

#Upload File Outputstream to REST API
builder = MultipartEntityBuilder.create();
builder.addBinaryBody(file, uploadFile);
entity = builder.build();

url = URL("https:\\clientdomainhostname\restapi\fileupload");
conn = url.openConnection();
conn.setDoOutput(True);
conn.setRequestMethod(POST);
conn.addRequestProperty(Content-Length, str(entity.getContentLength()));
fos = conn.getOutputStream();
entity.writeTo(fos);
fos.close();
conn.connect();
conn.getInputStream().close();
statusCode = conn.getResponseCode();

#Delete the Temporary File After Upload
uploadFile.delete()

Saturday, September 27, 2025

Earning Functional skills via Maximo Data

Every Maximo consultant must know about their client before managing service or implementing a change.

However, this may not kindle interest to a technical consultant or Developer. They are usually more excited about customizing an integration, developing automation scripts etc., but less interested in learning the intricacies of Asset Maanagement or understanding the client’s operations.
Here are few methods to make the Functional learning interesting and easy.

Study your client:

Functional knowledge is meaningful only if it has business context. Hence, knowing about client’s business is crucial.

Finding answers to below questions, would help to gain business context.

·        What is their core business?  Like Transportation, Electricity, Banking, Hospital etc.

·        What are the applications and modules used by our client?

·        Identify the Custom and Out of the Box applications used by client.

·        Who are the end users of those applications? Technicians, Managers, Third party vendors etc.

Read Maximo Records:

This is another effective way to get the 'Business Perspective'.

·        Maximo records are artifacts of business transaction.

·        Maser data suggests the client’s core business details. Example: Assets, Companies, Items etc.

·        Transactional data such as work order; purchase requisition follow a cycle. Reading the description, worklog notes, status changes etc. can help us to understand what the client does on day-to day basis.

Explore Maximo data structure:

Maximo applications are interconnected at various levels. If we drill down from Modules, Application to granular level of data fields, then Maximo will reveal the meaning and functional goal behind each component.

·        Explore the various Objects (tables) & connection between them.

·        Most importantly, knowing the purpose of each object, field is essential to before working on an implementation or a change request.

·        Why: A simple change like ‘conditionally enabling a checkbox’, may not interest a ‘Maximo Developer’, but it can weigh a lot of business value; and fault in this functionality may result adverse impact and rework to business.

Learn via Configurations:

Custom and OOB Applications:

·        What are the 'Custom Applications' used by client? Why are they used?   

·        How is it different from Out of the Box? Why couldn't we achieve via OOB features?

Ask the above questions and find answers.  Discuss with client and suggest improvements.

Scrutinize the workflow.

Workflows are a great way to understand the business process. It gives a straightforward representation of business flow at granular level

Maximo status (Synonym domain)

·        Every status of Maximo record denotes part of Asset Management cycle.

·        Understand the process behind  each status.

·        Differentiate custom status with OOB and find out why is it used.

Integration:

·        Although Maximo can function as standalone system, most often it is required to interact with other systems of financial, work management, people management etc.

·        Understanding those external systems and transaction data help us to better understand the client’s business.

·        As the below questions and find answers; Discuss with your client with suggestions to improve.

o   What are the systems, data integrated with Maximo?

o   What is the Frequency of transaction

o   Is there a better way to do it? with simpler, faster means?

Reports:

BIRT reports, KPI charts are also good way to study and understand business process.

Analyze & Ask:

·        Analyze each part of implementation.

·        Explore the Maximo resources at IBM forums.

·        Then ask, “Is there a better way to do it?”  via

o   Configuration change / Customization / Upgrade

Be updated:

·        Keep learning about latest available & upcoming versioans on Maximo

·        Earn IBM badges , Certifications

Beyond Maximo:

·        Explore the 'EAM' concepts such as Asset Life cycle, Procurement process, Work order Management, Char-of account etc. beyond Maximo.

·        Understand 'What does it really mean in business world'?

Learn everyday:

               Every Fix, Change, Implementation is a way to learn.


 

Friday, August 29, 2025

Download and zip multiple attachments - via automation script

  • Maximo attachments can be uploaded and downloaded one at a time.
  • There is no out of the box option to select multiple attachments and download at once.
  • Here is a way to achive this via cusom dialog and automation sctipt.

Add custom dialog:

  • Modify or clone the View attachments dialog
  • Add a checkbox in the dialog to select the documents.

Type: Event

Event: toggleselectrow

  • Add a 'Download' custom action button at the footer of dialog.

Automation Script:
  • Create an action launch point for the button and write below code
from psdi.util import MXApplicationException;
from java.io import FileOutputStream;
from java.io import FileInputStream;
from java.nio.file import Paths;
from java.nio.file import Files;
from java.util.zip import ZipOutputStream;
from java.util.zip import ZipEntry;
from java.io import File;

if launchPoint=='<>':
    session=service.webclientsession()
    docTable=session.getDataBean("<dialog_id>")
    docVector=docTable.getSelection()
    
    filePaths=[]
    for doc in docVector:
        file=doc.getString("URLNAME")
        filePaths.append(file)
    
    downLoadPath="C:\\Users\\Public\\Downloads\\";
    fullPath=downLoadPath+"<FileName>.zip";
    fos = FileOutputStream(fullPath);
    zipOut = ZipOutputStream(fos);
  
    try:
        for filePath in filePaths:
            fileToZip = File(filePath);
            fis = FileInputStream(fileToZip);
            zipEntry = ZipEntry(fileToZip.getName());
            zipOut.putNextEntry(zipEntry);
            bytes = Files.readAllBytes(Paths.get(filePath));
            zipOut.write(bytes, 0, len(bytes));
            fis.close();
        zipOut.close();
        fos.close();
        print ("Compressed the Files to " +str(fullPath));        
																   
    except MXApplicationException as me:
        print ("Maximo Error : " + str(e));
    except Exception as e :
        print ("Error : " + str(e));

Sunday, June 29, 2025

Querying Maximo Status Tables

  • Maximo status tables are used to track the status changes and helpful to understand business flow in various modules like workorder, procurement etc.
  • Querying the status tables for specific record is simple, that by using record key as parameter (WONUM, PONUM, INVOICENUM etc.)
  • However, retrieving the previous/next status of specific status for  bulk of records can be tricky.
  • Here are few queries, that can be helpful in such cases.

Saturday, April 26, 2025

Excel Formulas - Helpful in BIRT Reports

 

  • BIRT reports are widely used in Maximo and sometimes require to build reports with many columns and field mapping.
  • I’ve been using excel formulas to generate scripts for Open, Fetch method
  • These are simple text formulas, yet useful for working with reports with many columns.

Open Method:

To Convert 'Select Query' for Open Method

Enter the SQL query as multiple lines in Excel sheet. Example: column A

Apply the formula in column B as below.

For First row only:

=CONCAT("var sqlText=""",A1,"""")

For other rows:

=CONCAT("+ "" ",A2,"""")

=CONCAT("+ "" ",A3,"""")

=CONCAT("+ "" ",A4,"""")

..

...


Note: The above formula does not add/append the params["where"] or other parameters. Manually edit before using it.



Fetch Method:

To Generate Fetch method field mapping scripts.

Copy the BIRT report dataSet field names to column A in excel sheet

Copy the Select Query Field names from 'Open method' to column B in excel sheet

Enter the formulas in Column C as below to generate Script of Fetch method

=CONCAT("row[""",A2,"""] = maximoDataSet.getString(""",B2,""");")

=CONCAT("row[""",A3,"""] = maximoDataSet.getTimestamp(""",B3,""");")

=CONCAT("row[""",A4,"""] = maximoDataSet.getInteger(""",B4,""");")




Extract 'Select Query' from 'Open Method’ sqlText:

Copy the value of sqlText Variable from Open method to 'A1' cell in column in excel sheet.

Apply the below formula in another cell. This will convert the sqlText to executable query.

=SUBSTITUTE(SUBSTITUTE(A1,"+ """,),"""",)






Saturday, March 22, 2025

Unlock the Maximo Start Center template via SQL

Maximo Start centers are useful to view different types of user data such as Workflow assignments, Result sets and other portals like Favourite applications, Bulletin board etc.

Each Start center is assigned to specific 'Security group' and Users can be granted 'access to edit' the portal themselves.

·    When a user opens the start center template to edit, a record will be inserted in SCCONFIG table with ‘groupnname as NULL’


·      If any other user tries to edit the same template, will get an error message as below.

·   Start center become locked for other user to edit and must wait until the main user Finish/Cancel the changes

·   In case, the main user is not reachable, or intermittently blocked access, it becomes impossible for others to edit.

·   There is a workaround to this by removing the entries in SCCONFIG, LAYOUT and other portal tables such as RSCONFIG, INBXCONFIG etc.


Here are the detailed steps.

1.  Query the SCCONFIG as below and get the layoutid

select scconfigid,* from scconfig (nolock) where sctemplateid=1601 and groupname is null;

2.  Query the SCCONFIG and LAYOUT tables using inner join to fetch related portal details.

select lo.scconfigid,layoutid,portletid,* from scconfig sc

inner join layout lo on sc.scconfigid=lo.scconfigid

where sc.sctemplateid=<>and sc.groupname is null and portletid<>'BBOARD'

Note: Bulletin board is not editable and no table for BBOARD. Hence it is excluded in the results.


Copy the LayoutIDs of each portal table.


 

3.  Generate and Execute the "Deletion Scripts' to remove entries from SCCONFIG, LAYOUT and Other Portal tables by using scconfigidlayoutid copied from above step.

delete from SCCONFIG where sctemplateid=<> and groupname is null and scconfigid=<scconfigid>;
delete from LAYOUT where scconfigid=<scconfigid>;
delete from ACTIONSCFG where layoutid=<layoutid>;
delete from FACONFIG where layoutid=<layoutid>;
delete from RSCONFIG where layoutid=<layoutid>;
delete from RSCONFIG where layoutid=<layoutid>; 
delete from INBXCONFIG where layoutid=<layoutid>;

Execute the script.

    Now, try opening the star center template, it will be editable.


Maximo 7.6 vs MAS 9 – Key differences in Deployment & Administration

  Upgrade from Maximo 7.6 to MAS 8 or MAS 9 has not only brought new application features, but also the way it is deployed. Here are fe...