Guides · Troubleshooting
Maximo data load errors, decoded
A failed load gives you an eight-character code and a sentence that often names an object you were not deliberately writing to. This guide explains what those messages mean and what to do about them.
In this guide
BMXAA0024E — the action is not allowed on object X
This is the most common message on a Maximo load. The full text reads something like this:
BMXAA0024E - The action Add is not allowed on object DOCLINKS.
Verify the business rules for the object and define the
appropriate action for the object. The phrase "verify the business rules for the object" sends most people to object configuration, conditional expressions, and data restrictions. None of those is the cause.
The actual cause
BMXAA0024E is a security message. Maximo refuses the action because the authenticated user does not hold the sigoption for that action on the application that owns the object. A sigoption is Maximo's per-application permission grant. To import through an object structure, the account needs INSERT, SAVE, and DELETE sigoptions on the relevant security application, matched to the actions the load performs.
The spreadsheet is not at fault. The same file loads once the grant exists.
Why the message names an object you were not loading
An object structure is a parent object plus its child objects, and
Maximo checks the action against every object in that structure. A
work order load can therefore report DOCLINKS, and an
asset load can report ASSETMETER. The object named in
the message is the one missing the grant. It sits further down the
structure than the object you had in mind.
The fix is per-object for the same reason. A grant of INSERT on the
work order application does not grant INSERT on the application
that owns DOCLINKS.
How to clear it
- Read the object name out of the message and take it literally. That object is the one Maximo refused.
-
Find the security application that owns the object. Attachments
sit under
DOCLINKS, and domain values sit underMAXDOMAINand its child objects. - In Security Groups, grant the specific action to the group that the loading account belongs to. Use Insert for ADD, Save for SAVE, and Read for READ.
- Sign the loading account out and back in. Maximo applies sigoption changes to a new session, and a stale session returns the identical error after a correct fix.
- Run the load in preview mode before you commit it. See the next section.
The READ variants of the message name objects such as
ORGANIZATION, COMPANIES,
ITEM, and LABOR. These are the same
failure on the retrieval side. A loading tool reads current values
before it writes, so that it can show you what will change, and
that read needs its own grant.
One decision worth making deliberately
The quickest way to stop these messages is to give the loading account broad rights. Consider what you give up first. A load account with narrow, explicit grants is a control, and it is a useful answer when IT asks what prevents an unauthorized change. Grant only the objects your loads actually touch.
Quick reference: the codes you will actually see
The message text below is quoted as Maximo emits it, with placeholders in braces. Codes whose message text we could not verify are left out rather than guessed at.
| Code | Message | What it means |
|---|---|---|
BMXAA0024E | The action ADD / READ / SAVE is not allowed on object {OBJECT}. | A security failure. The account does not hold the sigoption for that action on the application that owns the object. |
BMXAA0026E | The action could not be performed because the application server security is enabled. Proper authorization is required. | The credential reached the application server but is not authorized for the action. |
BMXAA1339E | Missing key value for key {ATTRIBUTE}. Key value cannot be empty. | A column that forms part of the primary key is blank in the source row. |
BMXAA4129E | The record for {KEYS} already exists. Ensure that the key value for the given record is unique. | An insert ran against an existing key. The load is usually meant to be an update. |
BMXAA5598E | Processing of an inbound transaction failed. The processing exception is identified in document {N}… | A wrapper from the Integration Framework. The cause is in the message reported next to it. |
BMXAA8318E | You cannot revise a job plan that is in revised status. | A pending revision already exists for that job plan. See the job plan guide. |
BMXAA0078E | An asset meter can only be added by an owning asset or measurepoint object. | ASSETMETER was loaded on its own instead of nested under its owning ASSET. |
BMXAA0213E | Please specify a valid classification structure. | CLASSSTRUCTUREID does not resolve. The usual causes are a hierarchy path error or a CLASSUSEWITH mismatch. |
BMXAA4195E | A value is required for the classification field on the classstructure object. | A CLASSSTRUCTURE row was supplied without its CLASSIFICATION value. |
BMXAR0022E | Data sheets cannot be added to work orders that do not have a location or asset. | The work order rows carry neither ASSETNUM nor LOCATION. |
BMXAA5598E needs one note. It is a wrapper rather than a diagnosis: the Integration Framework reporting that an inbound document failed. The message you need is the one printed next to it, so log the whole response rather than the first line.
Preview before you commit
Maximo's file import API validates a load without writing anything.
Send the import with a preview header set to 1, and it
returns counts instead of changes:
POST oslc/os/mxapimeter?action=importfile&lean=1
preview: 1
(CSV body) A clean run answers:
{"invaliddoc": 0, "totaldoc": 2, "validdoc": 2, "warningmsg": ""} A failing run reports what would have happened, with the codes attached, before anything is committed:
{"invaliddoc": 2, "totaldoc": 2, "validdoc": 0,
"warningmsg": "...BMXAA5598E ... BMXAA0024E - The action ADD
is not allowed on object METER..."} Two conditions must be met before a flat-file import will work at all. The object structure must have Support Flat Structure selected, and it must have no alias conflict. Resolve any alias conflict from the first child object down. An XML import does not need the flat structure setting.
Large files can use asynchronous import, available in Maximo
7.6.1.1 and later. It takes async=1 and a unique
name, and it returns a polling URL. On completion it
offers an error file in the same format as the upload, containing
only the failed rows and their messages. Correct those rows and
resubmit that file. This is the fastest correction loop Maximo
provides natively.
Why preview is worth the extra step
Every error on this page costs less to find before the load than after it, which is why IBM built preview mode in the first place. Whatever you load with, make previewing the default rather than the careful option. MaxQuickLoad works this way: the validation and preview steps cannot be skipped.
When the data is the problem
Security aside, most rejected rows fail on the mechanics of the target column: length, case, character encoding, or domain.
Length
Maximo truncates or rejects a value on the defined length of the attribute, and those lengths are not consistent between related objects. Here are four attributes from objects that people load constantly:
| Attribute | Type | Length |
|---|---|---|
LOCATIONS.LOCATION | UPPER | 25 |
LOCATIONS.DESCRIPTION | ALN | 100 |
JOBPLAN.DESCRIPTION | ALN | 100 |
JOBTASK.DESCRIPTION | ALN | 300 |
A job task description holds three times as much text as the job plan description above it. A sheet built by copying one description column between tabs will therefore truncate at the parent.
Case
Maximo upper-cases any attribute typed UPPER on the
way in. LOCATION, SITEID,
ORGID, and JPNUM are all UPPER, as are
most identifier fields. This matters less for the stored value than
for your own matching. If the sheet holds pump-01 and
Maximo holds PUMP-01, a case-sensitive lookup in the
source system treats them as two records and you load a duplicate.
Normalize case in the sheet before the load.
Characters that Excel accepts and the API rejects
Several characters survive a spreadsheet and then fail at the API.
Smart quotes and apostrophes pasted from Word are the most common.
En and em dashes typed where a hyphen was intended behave the same
way, as do non-breaking spaces copied from a web page. A trailing
space makes PUMP-01 a different key from
PUMP-01. A line break inside a cell splits a delimited
file. In a delimited file, a comma inside an unqualified value does
the same damage, which is what the text qualifier exists to
prevent. It defaults to a double quote.
Numeric columns need a number rather than a formatted string, so remove thousands separators, currency symbols, and percent signs. Date columns need one unambiguous format for the whole column. Excel will reformat part of a column without reporting it.
Domains
An attribute backed by a domain accepts only the values in that
domain. LOCATIONS.STATUS is bound to
LOCASSETSTATUS, and JOBPLAN.STATUS is
bound to JOBPLANSTATUS. Synonym domains add one
complication: they carry an internal value and an external value
that can differ. Load the value Maximo stores, not the label the
user sees on screen.
Autokeys, autonumbering, and generated keys
When Maximo generates the key, as it does for autonumbered assets, locations, and work orders, the key does not exist when you build the file. Sequence the load around that.
- Omit the generated key on an insert. A supplied value either collides with the sequence or overwrites it, which leaves the sequence pointing at a number that is already in use. This is also the answer to a question we are asked often: Maximo autonumbering does not reconcile itself with numbers you created manually.
- Refresh the parent before you load the children. After an insert that generated a key, read the record back and copy the real key onto the child rows. Children built against a placeholder key attach to nothing.
- Never write a placeholder into a child's parent-key column. Child rows must carry the parent's real key values. Auto-filling those columns with a generation token is the most common cause of orphaned rows and of children attached to the wrong parent.
- Treat a failed parent as a failed set. If the parent errored, its children did not load, whatever the run reported.
How to read a Maximo error you have never seen
Maximo keeps the codes stable across versions even when it rewords the surrounding text, so the code is the durable thing to search for and to log. This order saves the most time:
- Take the object name literally. The object in the message is the object that refused the action, even if you were not deliberately writing to it.
- Separate a security failure from a data failure. A security failure fails every row identically, and a data failure fails some rows and not others. That one observation usually tells you which half of the problem you are in.
- Find the wrapper and set it aside. Integration Framework errors nest: the outer message reports that a transaction failed, and the inner message says why.
- Reproduce the failure with a single row. A one-row preview separates a structural problem from a bad-data problem in about a minute.
- Check the session. After any security change, sign out and back in before you conclude that the change did not work.
If you hit a code this page does not cover, send us the code and the message. We are collecting them, and the ones that come up more than once get added here.
Related
Keep reading
Locations
Loading a Maximo location hierarchy
Why PARENT is not a stored column, and the errors that follow from it.
Job plans
Loading Maximo job plans and tasks
The revision number is part of the primary key, and most job plan trouble follows from that.
Index
All Maximo guides
Everything published so far, and what is being written next.
Ready to see it in action?
See a real load, start to finish
If your shop handles the field's spreadsheets through one-off scripts, manual entry, or ad-hoc load processes, request a demo.
- A real load, not slides — mapping, validation, preview, and upload on live data.
- Your scenarios — bring a sheet the field actually sends you — we'll talk through how it loads.
- IT questions welcome — security model, permissions, audit trail, and architecture — straight answers.
- About 30 minutes — and you leave knowing whether it fits. No pressure follow-up.
- A clear path after — qualified teams can pilot it in their own environment before any purchase.