Maximo

 View Only

 Question on integration between IBM Maximo and Oracle

Jump to  Best Answer
  • IBM Maximo
  • Maximo
  • maximo-integration
osama attia's profile image
osama attia posted 04/08/26 10:32 AM

Hi all,

We’re about to build a custom integration between IBM Maximo and Oracle ERP just to update item balances from Maximo to Oracle.

Since the scope is very limited, it didn’t make sense for us to go with the official connector, so we’re going with a custom approach.

I have a quick question for anyone who has worked on this before (either custom or using the connector):

When handling inventory balance, is it usually done by:

  • overwriting the value (current balance = 25 is sent and replaces what’s in Oracle),
    or
  • sending only the change (item balance changed by -1) and letting Oracle update the balance on its side?

Any insights would be really helpful.

Thanks!

#Maximo #maximo-integration #IBMMaximo

Maycon Belfort's profile image
Maycon Belfort IBM Champion  Best Answer

Hi Osama,

I have integrated Maximo with Oracle ERP using MIF invocation channels and Oracle's REST endpoints. I worked closely with the Oracle Development team, but I don't have experience with Oracle REST.

This is what I did:

  1. Created 2 custom attributes in the MATUSETRANS to track the integration status. ERPSENT (bool) and ERPMSG (ALN).
  2. Created an escalation on MATUSETRANS that triggers an invocation channel. You can have a condition that checks if the issuetype is ISSUE or RETURN and the ERPSENT = 0.
  3. An Invocation Channel INVENTORYOUT. Set the request object structure to include MATUSETRANS fields like itemnum, siteid, binnum, quantity, issueunit, and gldebitacct. I used XSL for XML transformation to Oracle's format.

  4. Created a REST handler pointing to Oracle ERP URL (e.g., https://your-oracle-instance/webservices/rest/.../accounttransaction), with POST method, Basic Auth, and application/xml content type.

  5. I used an autoscript as a User Exit to parse data before sending it. Here's a sample for a INVOKE.INVENTORYOUT.USEREXIT.OUT.AFTER script:

from psdi.util.logging import MXLoggerFactory from psdi.server import MXServer logger = MXLoggerFactory.getLogger("maximo.integration") def getIfaceControl(ifaceControl): # Fetch integration control options server = MXServer.getMXServer() ifaceControlMboSet = server.getMboSet("MAXIFACECONTROL", server.getSystemUserInfo()) ifaceControlMboSet.setWhere("ifacecontrol = '" + ifaceControl + "'") ifaceControlMboSet.reset() ifaceControlMboSet.setFlag(7, True) # READONLY options = {} ifaceControlMbo = ifaceControlMboSet.moveFirst() if ifaceControlMbo: maxControlValueMboSet = ifaceControlMbo.getMboSet("MAXCONTROLVALUE") maxControlValueMbo = maxControlValueMboSet.moveFirst() while maxControlValueMbo: options[maxControlValueMbo.getString("value")] = maxControlValueMbo.getString("newvalue") maxControlValueMbo = maxControlValueMboSet.moveNext() maxControlValueMboSet.close() ifaceControlMboSet.close() return options def getAccountExternalRefID(accountValue): # Resolve GL account to Oracle external ref ID server = MXServer.getMXServer() chartOfAccountMboSet = server.getMboSet("CHARTOFACCOUNTS", server.getSystemUserInfo()) chartOfAccountMboSet.setWhere("glaccount = '" + accountValue + "'") chartOfAccountMboSet.reset() chartOfAccountMboSet.setFlag(7, True) accountRefID = "" if not chartOfAccountMboSet.isEmpty(): chartOfAccountMbo = chartOfAccountMboSet.getMbo(0) accountRefID = chartOfAccountMbo.getString("externalrefid") chartOfAccountMboSet.close() return accountRefID # Main logic erData = mbo.getOwner() # MATUSETRANS data area siteID = erData.getCurrentDataAsString("siteid") siteIdXREF = getIfaceControl("SITEXREF").get(siteID, siteID) erData.setCurrentData("siteid", siteIdXREF) glDebitAcct = erData.getGL("gldebitacct") glDebitExternalRefID = getAccountExternalRefID(glDebitAcct) erData.setCurrentData("externalrefid", glDebitExternalRefID) logger.info("INVOKE.INVENTORYOUT.USEREXIT.OUT.AFTER - ending processing")

This maps Maximo siteid via an XREF table and resolves GL accounts for Oracle.

To handle the response from Oracle, I also used another XSL and a user exit script to update the ERPSENT and ERPMSG

Some fields that can help you start with the integration

Maximo Field Oracle Param Notes
SITEID PORGANIZATIONCODE Via SITEXREF
ITEMNUM PINVENTORYITEM Direct
BINNUM PSUBINVENTORYCODE Parse locator
QUANTITY PQUANTITY Direct
ISSUEUNIT PUOMCODE Direct
GLDEBITACCT PACCOUNTCCID Resolve externalrefid

Hopefully, this can give you an idea to start planning your integration.

Cheers,

Maycon

sawan mahajan's profile image
sawan mahajan

You can make use of MXGLTXN table in maximo and create object structure on it. All inventory transaction will be locked into this table MATUSETRANS, MATRECTRANS and INVTRANS. Coming to your question we just send difference to oracle. 

osama attia's profile image
osama attia

@sawan mahajan 

Thanks for your response.
 I wanted to check—is this based on prior experience? If so, could you please share a bit more detail about the business case?
Specifically, was the integration implemented using the IBM connector, or was it a custom solution?
I’ve been reviewing the IBM connector documentation, and the wording suggests that it sends the current balance, not the difference.
“The current balance on the inbound transaction is the total of the on-hand quantities for the combination of item, inventory organization, and subinventory.”
 
So I wanted to confirm—did I misunderstand this, or were you using a different approach
Updates to inventory balances - IBM Documentation
sawan mahajan's profile image
sawan mahajan

@osama attia Yes i recently work on maximo oracle integration where we need to send inventory transaction to oracle system. We have not used the ibm connector and only MIF components for customization. Here is the high-level steps we followed:

  1. Created object structure on MXGLTXN object (Non persistent object, if some field is missing just add it data will automatically get populated from corresponding owner table)
  2. Created a publish channel on MXGLTXN object structure 
  3. Created a HTTP Handler in end point and provide the detail of rest api like header, httpmethod, url
  4. (Optional) you can create a custom HTTP handler class to read the response and log it in custom audit table

I hope this clear for you. 

osama attia's profile image
osama attia

Thanks @Maycon Belfort and @sawan mahajan this was helpful !