From MidrangeWiki
Jump to: navigation, search

RPG is an acronym which stands for Report Program Generator. It is a programming language developed by IBM originally created for developing business applications.

See also on Wikipedia: RPG programming language

Programmers, coming to RPG from other programming environments, will still need to get some education to familiarize themselves with its capabilities, and how it functions.

There are four major versions of RPG currently in use... RPG II, RPG III, RPG 400, and RPG IV (sometimes referred to as ILE RPG). The latter has two distinctive flavours: the traditional column restricted language entry and the modern /Free alternative where most of the coding can be entered in a non-column restricted way.

RPG is most commonly associated with IBM Midrange platforms, however various RPG flavors have been developed for other platforms over the years including the IBM 1401, System/360, S/370 and follow-ons; the Hewlett Packard HP3000 [1]; as well as Wang, Sperry, Burroughs, and Digital PDP and VAX computers. While never immensely popular on non-IBM platforms, it did exist outside of IBM.

OS/400 contains extensive support for debugging and run-time identification of RPG code. There is a large established base of RPG code in production environments, usually performing heavy-lifting batch-oriented data tasks, or providing support for interactive ERP applications, either with native 5250 interface or with a graphical user interface (GUI) or Web Skin applied over the 5250 data stream.


RPG vs. other languages

Compared to other programming languages, RPG is especially strong in

  • transactional processing;
  • data base access, such as DB2;

The main perceived flaw with RPG is that it is not object-oriented (OO), nor does it contain direct support for a browser-based GUI (although there are RPG Third Party offerings to fill that gap).

RPG vs. Java

A comparison between RPG and Java can be made so long as Java is used in a developer framework, or one of the available application servers. Unlike Java, however, RPG contains language-level features for common business tasks such as database access.

Objects and RPG

Although RPG is perceived as not being object-oriented, the OS/400 operating system is composed entirely of objects that can be manipulated by RPG and other languages.

RPG has long had the capability of importing standardized blocks of code to do standard functions via /COPY or /INCLUDE. Additionally, several versions of RPG support calling a sub-program, thus many aspects of object management are facilitated within RPG.

Further, with the advent of service programs on the IBM iSeries platform, ILE RPG becomes even more object oriented by offering user-written service procedures that can be used as functions in the calling program's code. These service procedures are analogous to what are called "methods" in the OO world. Such service procedures can also be thought of as APIs when they are used for the purpose of cross-application access.


API stands for Application Program Interface. RPG has access to C functions via service programs in binding directory QC2LE, as well as CEE APIs. There are also APIs specific to IBM i, like IFS access.

A new API mechanism is called IBM Rational Open Access: RPG Edition [1] Open Access is a separately purchased product for IBM i 6.1 and above via handlers similar to using SPECIAL files.

Conditional compilation

Conditional compilation is a mechanism that allows you to include or omit sections of code based on the compilation environment. This is in contrast to editing the code to add or remove sections. A typical reason for conditional compilation is code only used during testing. Imagine a scenario where you're writing a program that will perform a web service. Putting it in debug might be problematic because halting on a breakpoint will stop all web users from seeing results. So you insert code that logs useful information to an IFS file. Unfortunately, leaving that code in all the time slows execution down too much. One solution is conditional compilation.

Conditional compilation uses condition-names as the main driver. In conjunction with condition-names, compiler directives /IF, /ENDIF, /ELSE and /ELSEIF are used to perform the tests the compiler will use to determine whether to include a section of code or not. Condition-names can be predefined by the compiler, or defined by the developer via /DEFINE and /UNDEFINE. There is one last directive, /EOF, which tells the compiler to ignore any remaining source lines in the source member.

An example might make this easier.

      /if defined(LOG_FULL)
        logDebug('customer credit code': creditCode)
        logDebug('customer A/R balance': %editc(balance: 'J')

If LOG_FULL is defined, either in the compile command: DEFINE(LOG_FULL), or within the source code: /DEFINE LOG_FULL then this logging code is included and compiled. If LOG_FULL is not defined, that code is not compiled.

RPG comes with some useful predefined condition-names:

i5/OS version Condition-name Purpose
V5R4 *CRTRPGMOD Set if the compilation command is CRTRPGMOD
V5R4 *CRTBNDRPG Set if the compilation command is CRTBNDRPG
V5R4 *VxRxMx Set if the TGTRLS on the compile command is this level OR LATER. For example, if *V5R4M0 is specified, it will evaluate true if TGTRLS is V5R4, 6.1, 7.1 or higher.


      /if defined(*CRTBNDRPG)
     H dftactgrp(*no) actgrp('MYCOMPANY')
      /if defined(*V5R4M0)
       callp someV5R4API();
       callp ourHandWrittenVersion();

This article is a stub. You can help by editing it.

Open Source Sites

External Links

  • RPG Developer Network
  • "RPG: A Great Language with a Greater History" by Brian Kelly, The Four Hundred, Volume 18, Number 30 -- August 17, 2009 [2]


  1. IBM United States Software Announcement 210-114 , IBM Rational Open Access: RPG Edition delivers RPG IV extensibility to access new devices and resources ,13 Apr 2010. Retrieved on 19 Apr 2010


This category has the following 2 subcategories, out of 2 total.