IBM i message

CPF9898: General-purpose message (program text)

CPF9898 is a general-purpose IBM i message that programs use to send their own text. It has no fixed meaning. The meaning is whatever text the program put in it, and the program that sent it is the one to ask about.

Other names for this code

Also written as MSGID CPF9898, CPF9898 message, CPF9898 escape, SNDPGMMSG CPF9898, CPF9898 QCPFMSG.

What it means

CPF9898 lives in the IBM i message file QCPFMSG like any other system message, but its text is nothing more than a single substitution variable followed by a period. Whatever text the sending program passes as message data becomes the message. So two CPF9898 messages from two programs can mean entirely different things.

Programs use it because some message types need a message ID. An escape message, which ends the sending program and tells its caller that something failed, can't be sent as plain text. CPF9898 gives application code a ready-made ID for that, so a CL program can run SNDPGMMSG with MSGID(CPF9898), MSGF(QCPFMSG), its own text in MSGDTA and MSGTYPE(*ESCAPE). The SND-MSG operation in newer ILE RPG uses CPF9898 by default when it sends an escape message with plain text.

IBM's own code uses it too. Some database restore and support programs report conditions with CPF9898 and their own text. So the first job is always to read the text and find out which program sent it.

Common causes

  • An application program found a business or data condition it treats as an error, such as a closed period or a missing control record, and ended with a CPF9898 escape message.
  • A CL program's error handler caught an earlier error and resent it as CPF9898 with a short description.
  • An exit program, such as one that blocks certain commands for certain users, refused a request and explained why in a CPF9898 message.
  • A vendor product or an IBM utility used CPF9898 to report its own condition.

How to find the problem

  1. Read the text first. It is the whole message. On the message screen or in DSPJOBLOG, put the cursor on CPF9898 and press F1.
  2. Press F9 on the help screen to see the message details. The sending program and library tell you which application or product sent it, and the receiving program shows where it went.
  3. Look at the messages just before CPF9898 in the job log. If the program resent an earlier error, the original one is often still there.
  4. If you have the source, search it for CPF9898 or for a phrase from the text to find the exact line that sends it.

How to fix it

  • Act on the text. If it says a period is closed or a record is missing, the fix is in the data or the run order, not in the system.
  • If the text isn't clear, give the application's support team the full text, the sending program from F9 and the job log.
  • If the CPF9898 was sent as an escape message and nothing monitored it, the caller will show a function check (CPF9999) after it. Fixing the condition in the text clears both.
  • For your own programs, consider defining your own message IDs in a message file with CRTMSGF and ADDMSGD. They can carry their own help text, typed values such as numbers, and a severity you choose. CPF9898 only carries your text.

What it looks like

Payroll period 202610 is already closed.

IBM documentation

IBM Display Message Descriptions (DSPMSGD). Use the documentation for your installed release.

This link opens the relevant IBM reference library or lookup instructions. Match the complete code and your installed product release; it is not a code-specific review.

Read the installed message description:

DSPMSGD MSGID(CPF9898) MSGF(QSYS/QCPFMSG)

Also inspect the full job log and second-level message text, including substitution values.

Report a correction to WND Software.

Questions

What does CPF9898 mean?

Only what its text says. It is an empty message that programs fill with their own text, so look at the text and at the program that sent it.

How do I find which program sent CPF9898?

Put the cursor on the message, press F1, then F9. The message details show the sending program and library.

Why not just send the text without a message ID?

Escape messages, which tell the caller that a program failed, need a message ID. CPF9898 is IBM's general-purpose ID for exactly that.