ABM0: BMS map not found
An ABM0 abend means a BMS request named a map that CICS couldn't find. The map name in the program doesn't match any map in the mapset CICS loaded, often because of a spelling difference or an old copy of the mapset.
Other names for this code
Also written as ABM0 abend, ABMO abend, CICS ABM0, abend ABM0, ABM0 map not found, BMS map not found.
What it means
Basic mapping support (BMS) builds 3270 screens from maps. Maps are grouped into a mapset, which is assembled from DFHMSD, DFHMDI and DFHMDF macros into a load module and defined to CICS like a program. Each DFHMDI macro starts one map, and its label is the map name.
When a program issues SEND MAP or RECEIVE MAP, it names a map and a mapset. CICS loads the mapset and then looks inside it for the map. If no map with that name is there, the transaction ends with ABM0 and a transaction dump.
The last character is a zero, not the letter O. Many people search for ABMO, but IBM's code is ABM0. The BMS abend codes all start with ABM, and this one ends in the digit zero.
Common causes
- The map name in the program doesn't match the label on the DFHMDI macro. A typo, or a name changed in one place and not the other, is the most common reason.
- The mapset was changed to add a new map and reassembled, but CICS still has the old copy in storage. Until the region loads the new copy, the new map doesn't exist as far as CICS is concerned.
- Only the symbolic map, the TYPE=DSECT copybook, was regenerated. The physical map, the TYPE=MAP load module that CICS actually uses, is still the old one.
- The program names the wrong mapset. The map exists, but in a different mapset than the one in the MAPSET option.
- The new mapset was link-edited into a library the region doesn't use, or into one that comes after an older copy in the search order.
- The map name is held in a variable, and the variable has the wrong value or spaces when the command runs.
How to find the problem
- The region's message log shows the transaction and program with abend ABM0. Use the transaction dump or trace to find the SEND MAP or RECEIVE MAP that failed and the map and mapset names it passed.
- CEDF shows the MAP and MAPSET options on the command before CICS runs it, which is often the quickest check.
- Open the mapset source. Every DFHMDI label is a map name. Compare them with the name in the program character by character.
- Run
CEMT INQUIRE PROGRAM(mapset)to check that the mapset is defined and enabled, and on current releases which library it was loaded from. - Compare the date the mapset load module was last link-edited with the time the region last loaded it. If the module is newer, CICS is still using the old copy.
How to fix it
- Correct the map name in the program, or the DFHMDI label in the mapset, so the two match.
- After reassembling a mapset, make CICS load the new copy with
CEMT SET PROGRAM(mapset) NEWCOPYorPHASEIN. - Generate the physical map and the symbolic map from the same source every time, and recompile the programs that copy the symbolic map.
- Make sure the library you link-edit into is in the region's DFHRPL concatenation or a dynamic LIBRARY, ahead of any older copy.
- If the map name comes from a variable, check its value before the SEND MAP or RECEIVE MAP.
What it looks like
DFHAC2206 10:14:07 CICSPRD1 Transaction ORDE failed with abend ABM0. Updates to local recoverable resources backed out.
IBM documentation
IBM documentation: ABM0. Use the documentation for your installed release.
Related codes
Questions
Is it ABM0 with a zero or ABMO with a letter O?
A zero. Search for ABM0 when you look it up in IBM's abend code list.
What happens if the whole mapset is missing?
Then CICS can't load the mapset at all, and you usually see a program-not-found abend such as APCT instead of ABM0. ABM0 means the mapset loaded but the map wasn't in it.
Why does it work in test but fail in production?
The production region is probably using an older copy of the mapset, or loads it from a different library. Check the library and issue a NEWCOPY.