Coder en RPG IV colonné, les mêmes programmes, en plus lisible
Les trois programmes de la page RPG III, réécrits en RPG IV (ILE RPG) toujours en colonnes : zones déclarées en spécification D, expressions dans EVAL et IF, fonctions intégrées à la place des indicateurs. Compilés par CRTBNDRPG, débogués dans STRDBG et testés sur un IBM i 7.5.
En une phrase
Le RPG IV (ILE RPG, type de membre RPGLE) garde
les colonnes du RPG, mais les élargit, ajoute la spécification D pour déclarer les
zones et les paramètres, et accepte de vraies expressions : on le compile par
CRTBNDRPG et on le débogue dans STRDBG.
Préparer l'atelier
Même démarche qu'en RPG III, dans une nouvelle bibliothèque JOBIR4.
Le fichier source s'appelle QRPGLESRC : SEU donne alors automatiquement le type
RPGLE à un membre neuf. Le RPG IV est sorti en 1994 ; ses programmes sont des programmes
ILE.
CRTLIB LIB(JOBIR4) TEXT('job-i.fr : coder en RPG IV colonne')
CRTSRCPF FILE(JOBIR4/QRPGLESRC) RCDLEN(92)
CRTSRCPF FILE(JOBIR4/QDDSSRC) RCDLEN(92)
CRTSRCPF FILE(JOBIR4/QCLSRC) RCDLEN(92)
ADDLIBLE JOBIR4
Le fichier ARTICLE, le LF ARTICL1 et l'écran ARTECR sont exactement les mêmes DDS qu'en RPG III : le PF, le LF et l'écran. Seul le programme change. Les DDS ne dépendent pas du langage.

FMT FX suit le RPG IV, avec ses colonnes plus larges.
%FOUND.Les colonnes du RPG IV
Toujours une lettre en colonne 6. L'ordre devient H, puis F et D (que l'on peut mélanger depuis la 7.2), I, C, O, et enfin les sous-procédures (P). Il n'y a plus de spécification E : tableaux, zones et paramètres se déclarent tous en spécification D.
Spécification F (fichiers)
| Colonnes | Zone | Ce qu'on y met |
|---|---|---|
| 7-16 | Nom du fichier | Dix caractères, au lieu de huit en RPG III. |
| 17 | Type | I entrée, O sortie, U mise à jour, C combiné (écran). |
| 18 | Désignation | F : procédure complète, le programme lit lui-même. |
| 22 | Format | E : décrit en externe, les zones viennent des DDS. |
| 34 | Type d'adresse | K : accès par la clé. |
| 36-42 | Unité | DISK, WORKSTN, PRINTER. |
| 44-80 | Mots-clés | RENAME, PREFIX, INFDS… en toutes lettres. |
Spécification D (déclarations)
| Colonnes | Zone | Ce qu'on y met |
|---|---|---|
| 7-21 | Nom | Quinze caractères sur la ligne, et la casse est libre : PCode, Qte. |
| 24-25 | Type de déclaration | S zone simple, C constante, DS structure, PR prototype, PI interface de procédure ; à blanc, un paramètre ou une sous-zone. |
| 33-39 | Longueur | Cadrée à droite. |
| 40 | Type de données | A caractère, P décimal condensé, S zoné… |
| 41-42 | Décimales | Pour les numériques. |
| 44-80 | Mots-clés | INZ (valeur initiale), DIM, LIKE… |
Spécification C (calculs)
| Colonnes | Zone | Ce qu'on y met |
|---|---|---|
| 12-25 | Facteur 1 | Quatorze positions au lieu de dix. |
| 26-35 | Code opération | Dix positions, extension comprise : UPDATE, ELSEIF, CHAIN(N). |
| 36-49 | Facteur 2 | Quatorze positions. |
| 36-80 | Facteur 2 étendu | Une expression complète pour EVAL, IF, ELSEIF, DOW… : Qte > ARTSTK. |
| 50-63 | Résultat | Quatorze positions. |
| 64-68 | Longueur | Rarement utile : on déclare plutôt en spécification D. |
| 71-76 | Indicateurs résultants | Toujours là, mais remplacés par %FOUND, %EOF, %ERROR. |
Programme 1 Hello world
Hello world : une déclaration, deux calculs
D* HELLO : le premier programme RPG IV
DMsg S 13A Inz('Hello world !')
C Msg DSPLY
C EVAL *INLR = *ON
DMsg S 13A Inz('Hello world !')- Une zone simple (
S) de 13 caractères (A), avec sa valeur initiale. Le littéral est en zone mots-clés : plus besoin de MOVEL puis MOVE comme en RPG III. C Msg DSPLY- Affiche le facteur 1, comme en RPG III.
C EVAL *INLR = *ON- Allume LR par une affectation, en facteur 2 étendu.
CRTBNDRPG PGM(JOBIR4/HELLO) SRCFILE(JOBIR4/QRPGLESRC) DBGVIEW(*SOURCE)
CALL HELLO

Programme 2 Sans écran, avec un PF à clé
Sortir du stock un article lu par sa clé
Même rôle, mêmes paramètres et mêmes codes retour qu'en RPG III : SORTIE reçoit un code article et une
quantité, et rend OK, INC ou INS.
FARTICLE UF E K DISK
D* SORTIE : sortie de stock d'un article, sans ecran.
D* Parametres : code article, quantite (5 chiffres),
D* code retour : OK, INC (inconnu), INS (stock insuffisant)
DSORTIE PI
D PCode 5A
D PQteA 5A
D PRet 3A
DQte S 5P 0
C*
C EVAL Qte = %DEC(PQteA:5:0)
C PCode CHAIN ARTICLE
C IF NOT %FOUND(ARTICLE)
C EVAL PRet = 'INC'
C ELSEIF Qte > ARTSTK
C EVAL PRet = 'INS'
C ELSE
C EVAL ARTSTK = ARTSTK - Qte
C UPDATE ARTICLR
C EVAL PRet = 'OK '
C ENDIF
C EVAL *INLR = *ON
FARTICLE UF E K DISK- La même déclaration qu'en RPG III, aux nouvelles positions :
Uen 17,Fen 18,Een 22,Ken 34,DISKen 36. DSORTIE PIet les trois lignes suivantes- L'interface du programme : les paramètres reçus, avec leur longueur et leur type. Elle remplace le
*ENTRY PLIST. Sur IBM i 7.5, aucun prototype n'est exigé pour le programme principal. DQte S 5P 0- La quantité en décimal condensé de 5 chiffres, déclarée à part au lieu de l'être dans un MOVE.
EVAL Qte = %DEC(PQteA:5:0)%DECconvertit le texte reçu en nombre.C PCode CHAIN ARTICLEpuisIF NOT %FOUND(ARTICLE)- Plus d'indicateur :
%FOUNDdit si le CHAIN a trouvé l'article. ELSEIF Qte > ARTSTK- Une seule structure IF, ELSEIF, ELSE, ENDIF, au lieu de deux IF imbriqués.
UPDATE ARTICLR- UPDATE en toutes lettres, toujours sur le nom du format.
Ce qui a changé depuis le RPG III
| RPG III | RPG IV | Ce qu'on y gagne |
|---|---|---|
*ENTRY PLIST et PARM | Spécification D de type PI | Les paramètres sont déclarés avec leur type, en tête de programme. |
MOVEL et MOVE pour construire un texte | INZ('Hello world !') | Plus de limite de 8 caractères : un littéral tient sur la ligne. |
MOVE PQTEA QTE 50 | EVAL Qte = %DEC(PQteA:5:0) | La conversion est explicite. |
Indicateur 91 en 54-55 du CHAIN | IF NOT %FOUND(ARTICLE) | La condition se lit en clair. |
IFGT, imbriqué dans un ELSE | ELSEIF Qte > ARTSTK | Une seule structure, plus d'imbrication. |
SUB QTE ARTSTK | EVAL ARTSTK = ARTSTK - Qte | Une expression, comme en mathématiques. |
UPDAT | UPDATE | Les codes opération ne sont plus tronqués à cinq lettres. |
SETON LR | EVAL *INLR = *ON | Même indicateur LR, autre écriture. |
CRTBNDRPG PGM(JOBIR4/SORTIE) SRCFILE(JOBIR4/QRPGLESRC) DBGVIEW(*SOURCE)
Programme 3 Un écran, un PF et un LF
Consulter un article par son code ou par son libellé
L'écran ARTECR et le LF ARTICL1 sont repris tels quels. Le programme fait la même chose qu'en RPG III, mais la boucle et les tests se lisent en clair :
FARTECR CF E WORKSTN
FARTICLE IF E K DISK
FARTICL1 IF E K DISK
C* ARTCON : consultation d'un article par son code (PF)
C* ou par le debut de son libelle (LF). F3 pour sortir.
C DOW NOT *IN03
C EXFMT ECRAN
C IF *IN03
C LEAVE
C ENDIF
C EVAL *IN41 = *OFF
C EVAL *IN42 = *OFF
C IF ECODE <> *BLANKS
C* Un code : acces direct par la cle du PF
C ECODE CHAIN ARTICLE
C EVAL *IN41 = NOT %FOUND(ARTICLE)
C ELSE
C* Sinon : positionnement dans le LF, puis lecture
C ERECH SETLL ARTICL1
C READ ARTICL1
C EVAL *IN42 = %EOF(ARTICL1)
C ENDIF
C* Rien trouve : on vide la fiche
C IF *IN41 OR *IN42
C CLEAR ARTCOD
C CLEAR ARTLIB
C CLEAR ARTSTK
C ENDIF
C ENDDO
C EVAL *INLR = *ON
DOW NOT *IN03…LEAVE- La boucle tourne tant que F3 n'est pas pressée ; LEAVE sort aussitôt après l'écran, sans refaire de recherche.
EVAL *IN41 = NOT %FOUND(ARTICLE)- L'indicateur 41 conditionne toujours le message « Article inconnu. » des DDS : on lui donne la
valeur de
%FOUND. EVAL *IN42 = %EOF(ARTICL1)- Même chose pour le message 42, après le READ dans le LF.
CLEAR ARTCOD- CLEAR remet une zone à blanc ou à zéro selon son type : plus besoin de MOVE *BLANKS et Z-ADD 0.
CRTPF FILE(JOBIR4/ARTICLE) SRCFILE(JOBIR4/QDDSSRC)
CRTLF FILE(JOBIR4/ARTICL1) SRCFILE(JOBIR4/QDDSSRC)
CRTDSPF FILE(JOBIR4/ARTECR) SRCFILE(JOBIR4/QDDSSRC)
CRTBNDRPG PGM(JOBIR4/ARTCON) SRCFILE(JOBIR4/QRPGLESRC) DBGVIEW(*SOURCE)
CALL ARTCON


Les quatre essais de la page RPG III (code connu, libellé, code inconnu, recherche vide) donnent les mêmes écrans, au caractère près.
Compiler avec CRTBNDRPG
- CRTBNDRPG crée le programme en une étape : il compile un module et le lie aussitôt en programme *PGM.
- L'option 14 de PDM appelle CRTBNDRPG pour un membre de type RPGLE.
- DBGVIEW(*SOURCE) garde la vue source pour STRDBG. Sans vue de débogage, STRDBG n'a pas de source à afficher.
- Le niveau de gravité par défaut est 10, de 0 à 20, comme le montre l'invite.

Déboguer avec STRDBG
Le débogueur du RPG III ne sert plus ici : STRISDB refuse un programme ILE.

STRISDB PGM(JOBIR4/SORTIE) : « Type de programme non valide. »Pour un programme ILE, c'est STRDBG. Il affiche le source, on pose les points d'arrêt, puis on rend la main (F12) et on appelle soi-même le programme, ou l'application qui l'appelle :
STRDBG PGM(JOBIR4/SORTIE) UPDPROD(*YES)
CALL SORTIE PARM('A0002' '00005' ' ')
ENDDBG
UPDPROD(*YES) pour la même raison qu'avec STRISDB : SORTIE met à jour ARTICLE, et la
valeur par défaut *NO protège les bibliothèques de production
(démonstration sur la page RPG III).

Curseur sur la ligne 15 (ELSEIF), F6, F12, puis l'appel : le programme s'arrête.

| Action | Comment | Résultat relevé |
|---|---|---|
| Afficher une zone | Curseur dessus et F11, ou EVAL Qte | QTE = 00005. et ARTSTK = 0001200. |
| Avancer d'une instruction | F10 | « Etape terminée à la ligne 17 », puis 18, puis 19 |
| Vérifier le calcul | EVAL ARTSTK en ligne 19 | ARTSTK = 0001195. |
| Reprendre | F12 | Le programme va jusqu'au bout |
| Changer une zone | EVAL ARTSTK = 3 | ARTSTK = 3 = 0000003. |

EVAL Qte sur la ligne de commande du débogueur : la quantité vaut 5.
Forcer le cas « stock insuffisant »
Second appel, même point d'arrêt, et cette fois EVAL ARTSTK = 3 avant de continuer :


Tester (tester, c'est douter !)
Le programme de test est le même source CL que pour le RPG III, compilé cette fois en CL ILE par CRTBNDCL. Il appelle SORTIE avec les mêmes paramètres et attend les mêmes codes retour.
CRTBNDCL PGM(JOBIR4/TSTSORTIE) SRCFILE(JOBIR4/QCLSRC) DBGVIEW(*SOURCE)
CALL TSTSORTIE

C'est l'intérêt d'un test écrit avant de réécrire : il prouve que la nouvelle version fait exactement ce que faisait l'ancienne. Le stock final est identique à celui de JOBIR3 : A0001 à 490, A0002 à 1 195, A0004 à 0.
Sources
Les exemples ont été créés et relevés sur un IBM i 7.5 (voir la méthode). Les définitions et les règles viennent de ces sources, consultées le 16 octobre 2026 :
- Start ISDB (STRISDB), IBM, IBM i 7.5 CL commands. ISDB, débogueur source interactif des programmes CL, COBOL et RPG ; les paramètres UPDPROD, INVPGM et PARM.
- Start Source Entry Utility (STRSEU), IBM, IBM i 7.5 CL commands. L'éditeur de source en 5250.
- Work with Members Using PDM (WRKMBRPDM), IBM, IBM i 7.5 CL commands. La liste des membres d'un fichier source et ses options (2, 5, 14…).
- Create Bound RPG Program (CRTBNDRPG), IBM, IBM i 7.5 CL commands. La création d'un programme ILE RPG en une étape, le paramètre DBGVIEW, le fichier STREAM source.
- Create Bound CL Program (CRTBNDCL), IBM, IBM i 7.5 CL commands. La compilation du programme de test en CL ILE.
- Start Debug (STRDBG), IBM, IBM i 7.5 CL commands. Le débogueur des programmes ILE et le paramètre UPDPROD.
- ILE RPG Programmer's Guide (SC09-2507-12), IBM, IBM i 7.5 (PDF). SEU et le type RPGLE ; CRTBNDRPG DBGVIEW(*SOURCE) puis STRDBG ; F10 pas à pas, F11 afficher, F12 reprendre ; les commandes BREAK et EVAL (EVAL COUNTER=3) ; UPDPROD(*NO) par défaut.
- ILE RPG Reference (SC09-2508-12), IBM, IBM i 7.5 (PDF). Les positions des spécifications F, D et C du RPG IV (facteur 1 en 12-25, opération en 26-35, facteur 2 en 36-49, facteur 2 étendu en 36-80) ; **FREE, présenté parmi les nouveautés de la 7.3 : code de la colonne 1 jusqu'au bout de la ligne ; DCL-PI *N ; REQPREXP(*NO) par défaut, pas de prototype obligatoire.
- IBM RPG, Wikipédia (en anglais). RPG III sur le System/38, RPG/400 sur l'AS/400, RPG IV en 1994.
- L'aide en ligne des commandes citées, livrée avec IBM i 7.5 et reprise en français dans les fiches des commandes CL de ce site. Paramètres de CRTRPGPGM, CRTBNDRPG, CRTCLPGM, CRTBNDCL, CALLPRC, STRISDB, STRDBG, STRSEU, WRKMBRPDM, CRTPF, CRTLF et CRTDSPF.
Questions fréquentes
Comment compiler un programme RPG IV ?
Avec CRTBNDRPG, qui crée directement un programme *PGM à partir d'un membre de type RPGLE, par exemple CRTBNDRPG PGM(MABIB/SORTIE) SRCFILE(MABIB/QRPGLESRC) DBGVIEW(*SOURCE). L'option 14 de PDM lance la même commande.
Peut-on déboguer un programme RPG IV avec STRISDB ?
Non : STRISDB refuse un programme ILE avec le message « Type de programme non valide ». On utilise STRDBG, après avoir compilé le programme avec DBGVIEW(*SOURCE).
Comment changer une variable pendant le débogage STRDBG ?
Sur la ligne de commande du débogueur, tapez EVAL suivi de l'affectation, par exemple EVAL ARTSTK = 3. EVAL ARTSTK seul affiche la valeur.
Qu'apporte le RPG IV colonné par rapport au RPG III ?
Des noms plus longs, la spécification D pour déclarer zones et paramètres, le facteur 2 étendu qui accepte des expressions (EVAL, IF, ELSEIF), les fonctions intégrées comme %FOUND et %EOF, et des codes opération complets (UPDATE au lieu de UPDAT).