Bulk upload images via Integration Framework



In the previous post, I have provided an example on how we can customize Object Structure to enable import/export binary data via MIF. In Maximo 7.6, the automation scripting framework has been greatly extended to support integration. With this update, we can enable import/export of binary data by adding a simple script without having to write and deploy custom java code. Below is an example how we can configure Maximo 7.6 to bulk upload images to Item Master application:

Step 1: Add an Object Structure integration script
  • Open System Configuration > Platform Configuration > Automation Script application
  • On Select Action menu, choose Create > Script for Integration
  • On the Create Script for Integration pop-up, enter the following details:
    • Select “Object Structure
    • Choose “MXITEM” for Object Structure
    • Select “Inbound Processing
    • Language: Python
    • Paste the following piece of code to the  Source Code text area:


    • Click on Create. Then save the script

Creating high performance service using MaximoCache

Sometimes in our application, we need to build custom services that run when Maximo starts. We can extend the psdi.server.AppService class and register it with MXServer by inserting a new entry into the MAXSERVICE table. If the service executes slow running queries, it is a good idea to cache the data in memory to improve performance. We can implement MaximoCache interface for this purpose. By doing this, we can initialize the service when MXServer starts and pre-load all data required by the service into JVM memory. When the service is called, it will only use cached data to provide instant response which gives a much better user experience. 

Below are the steps to create a sample service that loads all Location’s description into memory. The service will provide a function to check if an input string matches with a location’s description or not. We will call this check when user entering an Item’s description and it will throw an error whenever  the input matches with the description of any existing Location. This is not a very good use-case. But for the sake of simplicity, I hope it gives you an idea on how it can be implemented.


MboSet performance, Memory Cache, and DB Call


I recently had to look at ways to improve performance of a custom built operation in Maximo. Essentially, it is one of the many validation operations taken place after a user uploads a PO with a few hundred thousand lines.  The team here already built a high performance engine to handle the process, but even with it, this particular operation still take around 15-17 milliseconds to process each line which is too slow to their current standard. Imagine to process 200,000 PO lines, it will take nearly an hour just for this operation alone. There are a few dozen of these operations need to be executed, plus other standard basic Maximo operations like status change or save, the whole process takes up many hours.

With this millisecond operation, many assumptions or standard recommendations on improving performance may not work. In some instances, following the standard recommendations actually make it slower.

Import/Export Maximo ImageLib Data via Integration Framework

In Maximo, we can upload images as attachments in Doclinks which are stored as files the server or as avatar images which are stored as binary data inside the IMAGELIB table. Avatar image is quite useful to give the user a quick view of how an inventory item or an asset/location looks like.

While Maximo allows us to upload Doclinks attachments via MIF, uploading images to IMAGELIB table via MIF is not supported out-of-the-box. Therefore, in order to upload image, we can only do it manually one-by-one via Maximo’s GUI. For bulk loading, if we have access the DB server, we can write a stored procedure to read the files and import binary data directly into the DB. There are two scenarios I had in the past in which this approach doesn’t work:
  • When we built mobile apps and wanted to upload data to IMAGELIB. In that case, my team mate extended a REST handler class to achieve this requirement.
  • When we needed to bulk upload images, but the client did not allow us access to the database and database server.

Federated MBO – Filling the gap between Maximo and IOT


Recently I got some time to explore the new Federated MBO feature. I like it a lot because it is very simple to configure and quite powerful. Of course, prior to Maximo 7.6, the same functionality can be done with Java programming, but with this new feature, it is so easy to incorporate data from external systems into Maximo business logic and make a seamless experience to the end-users.

Basically, Federated MBO allows you to link API from an external system and make it looks like a standard object in Maximo and treat it like other standard Maximo objects such as displaying data on GUI or setting up workflow conditions or writing automation script against it. The key difference here is that data is not stored inside Maximo database but queried from the API on-the-fly when the object is accessed.

I can immediately think of several applications that are enabled by this feature:

Blanket Contract and Procurement in Maximo


A friend of mine who has experience with SAP asked whether Maximo can handle a “Blanket PO” process similar to SAP. I sent him my answer based on the scenario and requirement he provided and think it is probably worth posting here as some other people may find it interesting:



Maximo custom control (Part IV) – Create a chart control


In the previous posts, we have practised on how to create a JSP page, register it as component, and register a control. We also discussed on how to pass properties from control to its components and use it with conditional UI.

In this post, I will provide an example to build a chart control to display meter data of an asset.