Getting Started with IBM i Control Language (CL) Programming

  • Home
  • /
  • Blog
  • /
  • Getting Started with IBM i Control Language (CL) Programming

January 29, 2026

If you’re a gray-haired IBM-i Programmer like me (I prefer silver-fox BTW), you’ve definitely spent countless hours wrangling with the green screen, trying to make your system do exactly what you want. That’s where Control Language, or CL for short, comes in handy. It’s the scripting language built right into IBM i that lets you automate tasks, manage jobs, and control your environment with precision.

Today, I’m going to walk you through the basics and some practical tips based on a typical presentation on the topic. Think of this as your friendly guide to getting comfortable with CL programming.

What is CL and Why Should You Care?

Control Language is the command-line scripting tool for IBM i systems. It’s been around since the AS/400 days and is still a core part of modern IBM i operations. Unlike RPG or COBOL, which are more for application development, CL is all about system control. You use it to write programs that run commands, handle errors, and interact with files and objects.

Why bother learning it? Simple. CL lets you automate repetitive tasks, like backing up libraries or monitoring job queues. It’s fast to write, easy to debug, and integrates seamlessly with other IBM i features. If you’re an admin or programmer on IBM i, ignoring CL is like trying to drive without a steering wheel. Not fun.

The Structure of a CL Program

A CL program starts with the PGM command and ends with ENDPGM. Everything in between is your logic. Here’s a quick breakdown:

  • Declarations: Use DCL to declare variables. For example, DCL &MYVAR *CHAR LEN(10) sets up a character variable.
  • Commands: Run system commands like CPYF (copy file) or SNDMSG (send message).
  • Control Structures: IF, DO, ENDDO for loops and conditions.
  • Error Handling: MONMSG to monitor for messages and handle exceptions.

Let’s look at a simple AS400 style example. Suppose you want to copy a file and send a message if it succeeds.

PGM

DCL &FILE *CHAR LEN(10) VALUE('MYFILE')

CPYF FROMFILE(&FILE) TOFILE(BACKUP/&FILE)
MONMSG MSGID(CPF0000) EXEC(GOTO ERROR)

SNDMSG MSG('Copy successful!') TOUSR(*SYSOPR)
RETURN

ERROR: SNDMSG MSG('Copy failed!') TOUSR(*SYSOPR)
END: ENDPGM

See how straightforward that is? You declare your variable, run the command, monitor for errors, and handle them gracefully.

Key Commands Every CL Programmer Needs

Here are some essentials to get you started:

  1. DCL: Declare variables. Supports types like *CHAR, *DEC, *INT, and more.
  2. CHGVAR: Change a variable’s value. Like CHGVAR &COUNT VALUE(&COUNT + 1).
  3. IF and ELSE: Conditional logic. IF (&STATUS *EQ ‘OK’) THEN(DO something).
  4. DO and ENDDO: Group commands for loops or conditions.
  5. GOTO and LABEL: For jumping to sections, though use sparingly to keep code clean.
  6. CALL: Call another program or procedure.
  7. RTVxxx: Retrieve values, like RTVJOBA to get job attributes.
  8. SNDPGMMSG: Send program messages for logging or user feedback.

Remember, CL is case-insensitive for commands, but variables are case-sensitive in some contexts. Always test on a dev system.

Working with Parameters and Passing Data

One cool feature is passing parameters to CL programs. Use PARM in the PGM statement.

PGM PARM(&INPUT)

DCL &INPUT *CHAR LEN(50)

 /* Do stuff with &INPUT */

ENDPGM

You can call this with CALL MYCLPGM PARM(‘Hello World’). Perfect for modular code.

Error Monitoring and Best Practices

Always use MONMSG. It catches message IDs like CPFxxxx and lets you respond. Place it right after the command you’re monitoring.

Best tips:

  • Keep programs short and focused. One task per program.
  • Comment your code with /* comments */.
  • Use meaningful variable names.
  • Test with DEBUG(*YES) to step through.
  • For complex logic, consider embedding SQL or calling RPG subprocedures.

Wrapping Up

CL is a powerful tool in your IBM i toolkit. It’s not flashy, but it gets the job done efficiently. Start small, build a few utility programs, and you’ll wonder how you managed without it. If you’re new, grab the IBM i CL reference manual from IBM’s site and experiment in a sandbox library.

Got questions? Drop a comment below or stalk me on X @nickdotlitten. Keep coding, folks!

What is IBM CL?

IBM i Control Language (CL) is a powerful scripting language for the IBM AS/400, IBM iSeries and IBM i Systems. It’s got roots in the older IBM Job Control Language, and it works as a simple way to script commands, instructions and other functions into an easy-to-understand programs.

NickLitten


IBM i Software Developer, Digital Dad, AS400 Anarchist, RPG Modernizer, Shameless Trekkie, Belligerent Nerd, Englishman Abroad and Passionate Eater of Cheese and Biscuits.

Nick Litten Dot Com is a mixture of blog posts that can be sometimes serious, frequently playful and probably down-right pointless all in the space of a day.

Enjoy your stay, feel free to comment and remember: If at first you don't succeed then skydiving probably isn't a hobby you should look into.

Nick Litten

related posts:

{"email":"Email address invalid","url":"Website address invalid","required":"Required field missing"}

Subscribe NOW
7-day free trial

Take This Course with ALL ACCESS

Unlock your Learning Potential with instant access to every course and all new courses as they are released.
 [ For Serious Software Developers only ]

Online Learning for IBM i Software Technology Professionals

“The more that you read, the more things you will know. The more that you learn, the more places you’ll go.” – Dr. Seuss

>