Aller au contenu
Coder sur IBM i · 2 / 4 · RPG IV en colonnes

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.

3programmes, les mêmes qu'en RPG III
100colonnes de spécification, contre 80
0indicateur dans SORTIE
3/3cas de test réussis

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.

Écran d'édition SEU du membre SORTIE de type RPGLE : spécification F, spécifications D du PI, puis les calculs EVAL, CHAIN, IF et ELSEIF
SORTIE dans SEU : la règle FMT FX suit le RPG IV, avec ses colonnes plus larges.
Invite SEU d'une spécification C RPG IV : Facteur 1 PCode, Opération CHAIN, Facteur 2 ARTICLE, sans indicateur
F4 sur le CHAIN : plus d'indicateur obligatoire, le résultat se teste par %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)

ColonnesZoneCe qu'on y met
7-16Nom du fichierDix caractères, au lieu de huit en RPG III.
17TypeI entrée, O sortie, U mise à jour, C combiné (écran).
18DésignationF : procédure complète, le programme lit lui-même.
22FormatE : décrit en externe, les zones viennent des DDS.
34Type d'adresseK : accès par la clé.
36-42UnitéDISK, WORKSTN, PRINTER.
44-80Mots-clésRENAME, PREFIX, INFDS… en toutes lettres.

Spécification D (déclarations)

ColonnesZoneCe qu'on y met
7-21NomQuinze caractères sur la ligne, et la casse est libre : PCode, Qte.
24-25Type de déclarationS zone simple, C constante, DS structure, PR prototype, PI interface de procédure ; à blanc, un paramètre ou une sous-zone.
33-39LongueurCadrée à droite.
40Type de donnéesA caractère, P décimal condensé, S zoné…
41-42DécimalesPour les numériques.
44-80Mots-clésINZ (valeur initiale), DIM, LIKE…

Spécification C (calculs)

ColonnesZoneCe qu'on y met
12-25Facteur 1Quatorze positions au lieu de dix.
26-35Code opérationDix positions, extension comprise : UPDATE, ELSEIF, CHAIN(N).
36-49Facteur 2Quatorze positions.
36-80Facteur 2 étenduUne expression complète pour EVAL, IF, ELSEIF, DOW… : Qte > ARTSTK.
50-63RésultatQuatorze positions.
64-68LongueurRarement utile : on déclare plutôt en spécification D.
71-76Indicateurs résultantsToujours 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
Écran Entrée de commandes : après CALL HELLO, le message DSPLY Hello world ! apparaît dans l'historique
Même résultat qu'en RPG III : « DSPLY Hello world ! », visible dans l'écran d'entrée de commandes avec F10.

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 : U en 17, F en 18, E en 22, K en 34, DISK en 36.
DSORTIE PI et 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)
%DEC convertit le texte reçu en nombre.
C PCode CHAIN ARTICLE puis IF NOT %FOUND(ARTICLE)
Plus d'indicateur : %FOUND dit 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 IIIRPG IVCe qu'on y gagne
*ENTRY PLIST et PARMSpécification D de type PILes paramètres sont déclarés avec leur type, en tête de programme.
MOVEL et MOVE pour construire un texteINZ('Hello world !')Plus de limite de 8 caractères : un littéral tient sur la ligne.
MOVE PQTEA QTE 50EVAL Qte = %DEC(PQteA:5:0)La conversion est explicite.
Indicateur 91 en 54-55 du CHAINIF NOT %FOUND(ARTICLE)La condition se lit en clair.
IFGT, imbriqué dans un ELSEELSEIF Qte > ARTSTKUne seule structure, plus d'imbrication.
SUB QTE ARTSTKEVAL ARTSTK = ARTSTK - QteUne expression, comme en mathématiques.
UPDATUPDATELes codes opération ne sont plus tronqués à cinq lettres.
SETON LREVAL *INLR = *ONMê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
Écran ARTCON en RPG IV : début de libellé C saisi, l'article A0004 Clou 50 mm s'affiche
Libellé « C » : SETLL puis READ dans le LF.
Écran ARTCON en RPG IV : code Z9999 saisi, le message rouge Article inconnu s'affiche
Code inconnu : *IN41 allume le message.

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.
Invite CRTBNDRPG ouverte par l'option 14 de PDM : programme HELLO, fichier source QRPGLESRC, fichier STREAM source, niveau de gravité 10, groupe d'activation par défaut *YES
Option 14 et F4 : l'invite de CRTBNDRPG, avec un fichier STREAM source possible (un source dans l'IFS).

Déboguer avec STRDBG

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

Écran Entrée de commandes : STRISDB PGM(JOBIR4/SORTIE) répond Type de programme non valide
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).

Écran Source d'un module de STRDBG : programme SORTIE de JOBIR4, lignes 1 à 15 numérotées
STRDBG numérote les lignes du source de 1 en 1.

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

STRDBG arrêté à la ligne 15, ELSEIF Qte > ARTSTK, message Point d'arrêt à la ligne 15
Arrêt à la ligne 15 : le CHAIN a trouvé l'article, le test du stock va s'exécuter.
ActionCommentRésultat relevé
Afficher une zoneCurseur dessus et F11, ou EVAL QteQTE = 00005. et ARTSTK = 0001200.
Avancer d'une instructionF10« Etape terminée à la ligne 17 », puis 18, puis 19
Vérifier le calculEVAL ARTSTK en ligne 19ARTSTK = 0001195.
ReprendreF12Le programme va jusqu'au bout
Changer une zoneEVAL ARTSTK = 3ARTSTK = 3 = 0000003.
STRDBG arrêté à la ligne 15, en bas de l'écran QTE = 00005.
EVAL Qte sur la ligne de commande du débogueur : la quantité vaut 5.
STRDBG arrêté à la ligne 19 UPDATE, en bas de l'écran ARTSTK = 0001195.
Après trois F10, juste avant l'UPDATE : ARTSTK vaut 1 195.

Forcer le cas « stock insuffisant »

Second appel, même point d'arrêt, et cette fois EVAL ARTSTK = 3 avant de continuer :

STRDBG arrêté à la ligne 15, en bas de l'écran ARTSTK = 3 = 0000003.
EVAL avec une affectation change la zone en mémoire.
STRDBG après F10 : Etape terminée à la ligne 16, EVAL PRet = INS
F10 : 5 est supérieur à 3, le programme passe en ligne 16 et renverra INS. Le fichier n'est pas réécrit : A0002 reste à 1 195.

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
Écran Entrée de commandes après CALL TSTSORTIE dans JOBIR4 : les trois cas obtiennent le code attendu, cas en échec 000
Les trois cas réussis, comme en RPG III : la réécriture n'a rien changé au comportement.

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 :

  1. 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.
  2. Start Source Entry Utility (STRSEU), IBM, IBM i 7.5 CL commands. L'éditeur de source en 5250.
  3. 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…).
  4. 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.
  5. Create Bound CL Program (CRTBNDCL), IBM, IBM i 7.5 CL commands. La compilation du programme de test en CL ILE.
  6. Start Debug (STRDBG), IBM, IBM i 7.5 CL commands. Le débogueur des programmes ILE et le paramètre UPDPROD.
  7. 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.
  8. 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.
  9. IBM RPG, Wikipédia (en anglais). RPG III sur le System/38, RPG/400 sur l'AS/400, RPG IV en 1994.
  10. 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).