Aller au contenu
Coder sur IBM i · 1 / 4 · RPG III

Coder en RPG III, du premier programme au débogage

Trois programmes RPG/400 complets, écrits colonne par colonne : un Hello world, une sortie de stock sur un fichier à clé, puis un écran qui lit un fichier physique et un fichier logique. Pour chacun, la compilation, le débogage dans STRISDB et le test, tels qu'ils ont tourné sur un IBM i 7.5.

3programmes, du plus simple à l'écran
80colonnes, chacune avec son rôle
8objets à créer : 3 fichiers, 4 programmes, 1 bibliothèque
3/3cas de test réussis

En une phrase

Coder en RPG III (RPG/400), c'est écrire un membre source dans un fichier QRPGSRC, chaque information à une colonne précise, créer d'abord les fichiers qu'il utilise, le compiler par CRTRPGPGM, puis le suivre ligne à ligne dans STRISDB.

Préparer l'atelier

Le RPG III est né sur le System/38 ; sur l'AS/400, IBM a renommé son compilateur RPG/400. C'est lui qui compile encore aujourd'hui les programmes en colonnes : sur notre IBM i 7.5, l'en-tête du listing indique 5770WDS V7R5M0 et IBM RPG/400. Pour l'histoire, voir AS/400 et IBM i et le cycle GAP.

Il faut une bibliothèque et trois fichiers source : un pour le RPG, un pour les DDS (fichiers et écrans), un pour le CL. Avec une longueur de 92, chaque ligne garde 80 caractères de source, toute la largeur d'une ligne RPG.

CRTLIB    LIB(JOBIR3) TEXT('job-i.fr : coder en RPG III')
CRTSRCPF  FILE(JOBIR3/QRPGSRC) RCDLEN(92)
CRTSRCPF  FILE(JOBIR3/QDDSSRC) RCDLEN(92)
CRTSRCPF  FILE(JOBIR3/QCLSRC) RCDLEN(92)
ADDLIBLE  JOBIR3

Le source se tape dans SEU, l'éditeur 5250, que l'on ouvre par l'option 2 de PDM ou directement :

WRKMBRPDM FILE(JOBIR3/QRPGSRC)
STRSEU    SRCFILE(JOBIR3/QRPGSRC) SRCMBR(SORTIE)
Écran PDM Gestion des membres du fichier QRPGSRC de JOBIR3 : membres ARTCON, HELLO et SORTIE de type RPG, options 2=Editer et 14=Compiler
PDM liste les membres du fichier source. Le type RPG dit à PDM et à SEU qu'il s'agit de RPG III ; l'option 14 compile.
Écran d'édition SEU du membre SORTIE : la ligne de format FMT FX en haut, puis les lignes F et C numérotées
SEU affiche le source avec ses numéros de séquence. La ligne FMT du haut rappelle les colonnes de la spécification en cours.

Le meilleur ami du débutant est la touche F4 : sur une ligne, elle ouvre une invite où chaque zone a son libellé. Plus besoin de compter les colonnes.

Invite SEU d'une spécification C : Facteur 1 PCODE, Opération CHAIN, Facteur 2 ARTICLE, indicateur 91 sous la colonne des indicateurs résultants
F4 sur la ligne du CHAIN : PCODE en facteur 1, ARTICLE en facteur 2, et l'indicateur 91 sous >>, la première paire d'indicateurs résultants.

La spécification C, colonne par colonne

Un programme RPG III est une suite de spécifications, toujours dans cet ordre : H (contrôle), F (fichiers), E (tableaux), L, I (entrées), C (calculs), O (sorties). La lettre est en colonne 6. Le travail se fait dans les lignes C, dont SEU donne la règle : CL0N01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHiLoEqComments.

ColonnesZoneCe qu'on y met
6Type de spécificationC pour un calcul. Un * en colonne 7 fait de la ligne un commentaire.
7-8NiveauNiveau de rupture (L1 à L9, LR) ou SR pour une sous-routine. Vide la plupart du temps.
9-17Indicateurs de conditionJusqu'à trois indicateurs (N pour la négation) : la ligne ne s'exécute que s'ils sont vrais.
18-27Facteur 1Premier opérande : la clé d'un CHAIN, la zone comparée par un IFxx.
28-32Code opérationCinq caractères au plus : CHAIN, MOVEL, UPDAT (et non UPDATE).
33-42Facteur 2Second opérande : le fichier lu, la valeur ajoutée, le littéral déplacé.
43-48RésultatLa zone qui reçoit le résultat. Six caractères au plus pour un nom.
49-51LongueurDéclare la zone résultat à sa première apparition, cadrée à droite.
52DécimalesNombre de décimales : une zone avec une décimale, même 0, est numérique.
53ExtensionH arrondi, N lecture sans verrouillage, P complément à blanc.
54-59Indicateurs résultantsTrois paires : supérieur ou non trouvé (54-55), inférieur ou erreur (56-57), égal ou fin de fichier (58-59).
60-74CommentaireTexte libre en fin de ligne.

Conséquence directe : un littéral en facteur 1 ou 2 tient en dix positions, apostrophes comprises, soit 8 caractères utiles. C'est pour cela que le premier programme construit son message en deux fois.

Programme 1 Hello world

Hello world : quatre lignes de calcul

     C* HELLO : le premier programme RPG III
     C* Construit le message dans la zone MSG, puis l'affiche.
     C                     MOVEL'Hello'   MSG    13
     C                     MOVE 'world !' MSG
     C           MSG       DSPLY
     C                     SETON                     LR
MOVEL'Hello' MSG 13
Déclare la zone MSG de 13 caractères (longueur en 49-51) et y place « Hello » à gauche (MOVEL, move left). Le reste est à blanc.
MOVE 'world !' MSG
MOVE cadre à droite : « world ! » occupe les 7 dernières positions. MSG vaut maintenant « Hello world ! ».
MSG DSPLY
Affiche le contenu du facteur 1.
SETON LR
Allume LR (last record) : le programme se termine et ferme ce qu'il a ouvert. Sans lui, le cycle du RPG relancerait les calculs sans fin.

Ce programme n'a ni spécification F ni fichier : il se compile tout de suite.

CRTRPGPGM PGM(JOBIR3/HELLO) SRCFILE(JOBIR3/QRPGSRC) OPTION(*SRCDBG)
CALL HELLO
Écran Entrée de commandes : après CALL HELLO, le message DSPLY Hello world ! apparaît dans l'historique
Sans zone de réponse, DSPLY envoie un message d'information au travail : « DSPLY Hello world ! ». Il s'affiche dans l'écran d'entrée de commandes (CALL QCMD) avec F10, qui inclut les messages détaillés.

À retenir

  • Une zone se déclare dans le calcul où elle apparaît pour la première fois, avec sa longueur.
  • MOVEL cadre à gauche, MOVE cadre à droite.
  • Tout programme se termine par SETON LR.

Programme 2 Sans écran, avec un PF à clé

Sortir du stock un article lu par sa clé

Le fichier d'abord. Un fichier physique ARTICLE, un enregistrement par code article, avec une clé unique :

     A* ARTICLE : les articles en stock, un par code
     A                                      UNIQUE
     A          R ARTICLR                   TEXT('Article')
     A            ARTCOD         5A         COLHDG('Code')
     A            ARTLIB        30A         COLHDG('Libelle')
     A            ARTSTK         7P 0       COLHDG('Stock')
     A          K ARTCOD
CRTPF FILE(JOBIR3/ARTICLE) SRCFILE(JOBIR3/QDDSSRC)

INSERT INTO JOBIR3.ARTICLE VALUES
  ('A0001', 'Vis inox 4 x 40', 500), ('A0002', 'Écrou M6', 1200),
  ('A0003', 'Rondelle M6', 800),     ('A0004', 'Clou 50 mm', 0),
  ('A0005', 'Boulon M8 x 60', 150)

Le programme SORTIE reçoit un code article et une quantité, retire la quantité du stock et rend un code retour : OK, INC (article inconnu) ou INS (stock insuffisant). Aucun écran : c'est le genre de programme qu'appellent un traitement par lots ou un autre programme.

     FARTICLE UF  E           K        DISK
     C* SORTIE : sortie de stock d'un article, sans ecran.
     C* Parametres : code article, quantite (5 chiffres),
     C* code retour : OK, INC (inconnu), INS (stock insuffisant)
     C           *ENTRY    PLIST
     C                     PARM           PCODE   5
     C                     PARM           PQTEA   5
     C                     PARM           PRET    3
     C*
     C                     MOVE PQTEA     QTE     50
     C           PCODE     CHAINARTICLE              91
     C           *IN91     IFEQ '1'
     C                     MOVE 'INC'     PRET
     C                     ELSE
     C           QTE       IFGT ARTSTK
     C                     MOVE 'INS'     PRET
     C                     ELSE
     C                     SUB  QTE       ARTSTK
     C                     UPDATARTICLR
     C                     MOVE 'OK '     PRET
     C                     ENDIF
     C                     ENDIF
     C                     SETON                     LR
FARTICLE UF E K DISK
Le fichier ARTICLE, ouvert en mise à jour (U en 15), en procédure complète (F en 16 : c'est le programme qui lit, pas le cycle), décrit en externe (E en 19) : ses zones viennent des DDS. K en 31 : accès par la clé. DISK en 40.
*ENTRY PLIST et les trois PARM
Les paramètres reçus, dans l'ordre de l'appel : PCODE (5), PQTEA (5) et PRET (3), où le programme écrit son code retour.
MOVE PQTEA QTE 50
La quantité arrive en caractères ('00005') ; MOVE la range dans QTE, numérique de 5 chiffres sans décimale (5 en 51, 0 en 52).
PCODE CHAINARTICLE 91
Lit l'article dont la clé vaut PCODE. S'il n'existe pas, l'indicateur 91 (colonnes 54-55) s'allume. Le CHAIN d'un fichier en mise à jour verrouille l'enregistrement.
SUB QTE ARTSTK puis UPDATARTICLR
Retire la quantité de la zone ARTSTK lue, puis réécrit l'enregistrement. UPDAT porte le nom du format (ARTICLR), pas celui du fichier, et exige une lecture préalable sans N en colonne 53.
CRTRPGPGM PGM(JOBIR3/SORTIE) SRCFILE(JOBIR3/QRPGSRC) OPTION(*SRCDBG)

Le programme se teste plus loin, avec un CL de test, parce que son code retour ne se voit pas depuis une ligne de commande.

Programme 3 Un écran, un PF et un LF

Consulter un article par son code ou par son libellé

Le programme ARTCON affiche un article. On tape son code, et le programme le lit dans le PF par la clé. Ou bien on tape le début d'un libellé, et il se place dans un fichier logique trié par libellé, puis lit le premier article à partir de ce texte.

Le LF : les mêmes articles, dans l'ordre du libellé

     A* ARTICL1 : les memes articles, dans l'ordre du libelle
     A          R ARTICL1R                  PFILE(ARTICLE)
     A            ARTCOD
     A            ARTLIB
     A            ARTSTK
     A          K ARTLIB

L'écran (DSPF)

     A* ARTECR : ecran de consultation des articles
     A                                      DSPSIZ(24 80 *DS3)
     A                                      CA03(03 'Fin')
     A          R ECRAN
     A                                  1  2'ARTCON'
     A                                  1 28'Consultation des articles'
     A                                      DSPATR(HI)
     A                                  3  2'Code article . . . . . :'
     A            ECODE          5A  B  3 28
     A                                  4  2'ou début du libellé . :'
     A            ERECH         30A  B  4 28CHECK(LC)
     A                                  7  2'Code . . . . :'
     A            ARTCOD         5A  O  7 17
     A                                  8  2'Libellé  . . :'
     A            ARTLIB        30A  O  8 17
     A                                  9  2'Stock  . . . :'
     A            ARTSTK         7Y 0O  9 17EDTCDE(3)
     A  41                             20  2'Article inconnu.'
     A                                      COLOR(RED)
     A  42                             20  2'Aucun libellé trouvé.'
     A                                      COLOR(RED)
     A                                 23  2'F3=Fin'
     A                                      COLOR(BLU)
CA03(03 'Fin')
F3 allume l'indicateur 03, que le programme lit dans *IN03.
ECODE et ERECH en B
Les deux zones de saisie, en entrée et sortie. CHECK(LC) accepte les minuscules dans la recherche par libellé.
ARTCOD, ARTLIB, ARTSTK en O
Les zones affichées portent les mêmes noms que celles du fichier : en RPG, une zone lue par CHAIN est donc aussitôt prête à l'écran, sans un seul MOVE.
41 et 42 en colonnes 9-10
Les messages d'erreur ne s'affichent que si le programme allume ces indicateurs.

Le programme

     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           *IN03     DOWEQ'0'
     C                     EXFMTECRAN
     C           *IN03     IFEQ '0'
     C                     SETOF                     4142
     C           ECODE     IFNE *BLANKS
     C* Un code : acces direct par la cle du PF
     C           ECODE     CHAINARTICLE              41
     C                     ELSE
     C* Sinon : positionnement dans le LF, puis lecture
     C           ERECH     SETLLARTICL1
     C                     READ ARTICL1                  42
     C                     ENDIF
     C* Rien trouve : on vide la fiche
     C           *IN41     IFEQ '1'
     C           *IN42     OREQ '1'
     C                     MOVE *BLANKS   ARTCOD
     C                     MOVE *BLANKS   ARTLIB
     C                     Z-ADD0         ARTSTK
     C                     ENDIF
     C                     ENDIF
     C                     ENDDO
     C                     SETON                     LR
FARTECR CF E WORKSTN
L'écran, en fichier combiné (C : affichage et saisie).
*IN03 DOWEQ'0' … ENDDO
La boucle du dialogue : tant que F3 n'est pas pressée.
EXFMTECRAN
Affiche le format ECRAN et attend la réponse de l'utilisateur.
ECODE CHAINARTICLE 41
Un code est saisi : lecture directe dans le PF par sa clé ; 41 s'allume s'il est inconnu.
ERECH SETLLARTICL1 puis READ ARTICL1
Sinon, SETLL se place dans le LF devant le premier libellé supérieur ou égal au texte saisi, et READ le lit ; 42 (colonnes 58-59) s'allume s'il n'y a plus rien après.

L'ordre de création compte : le compilateur RPG lit les formats des fichiers décrits en externe. Le PF d'abord, puis le LF qui s'appuie sur lui, l'écran, et enfin le programme.

CRTLF     FILE(JOBIR3/ARTICL1) SRCFILE(JOBIR3/QDDSSRC)
CRTDSPF   FILE(JOBIR3/ARTECR) SRCFILE(JOBIR3/QDDSSRC)
CRTRPGPGM PGM(JOBIR3/ARTCON) SRCFILE(JOBIR3/QRPGSRC) OPTION(*SRCDBG)
CALL ARTCON
Écran ARTCON : code A0003 saisi, l'article Rondelle M6 s'affiche avec un stock de 800
Code A0003 : CHAIN dans le PF.
Écran ARTCON : début de libellé C saisi, l'article A0004 Clou 50 mm s'affiche
Libellé « C » : SETLL puis READ dans le LF.
Écran ARTCON : code Z9999 saisi, le message rouge Article inconnu s'affiche en ligne 20
Code inconnu : 41 allume le message.
Écran ARTCON : recherche vide, le premier article dans l'ordre du LF est A0002 Écrou M6
Recherche vide : le premier libellé du LF est « Écrou M6 ».

La dernière capture surprend : avec une recherche vide, le premier article du LF est « Écrou », avant « Boulon ». La clé est triée dans l'ordre du code EBCDIC, où « É » passe avant les lettres sans accent, comme sur la page des LF.

La première compilation a échoué

Dans sa première version, le LF s'appelait ARTLIB, comme la zone du libellé. Le compilateur RPG/400 a refusé le programme :

 SEQUENCE  *...1....+....2....+....3....+....4....+....5....+....6....+....7...*  INDIC  DO    MODIF      LIGNE  PROGRAMME
      300  FARTLIB  IF  E           K        DISK
  B000002                                           6  35 ARTLIB                Libelle
* 4143                                               4143-******
     2200  C                     MOVE *BLANKS   ARTLIB                                   003
* 5194                                     5194-******
  D000006                            ARTLIB    72  CHAR   30
* 6048                          6048-******

* QRG4143 Gravité :  30   Nombre :    2
          Message . . . . :   Nom déjà défini comme nom de fichier,
            d'enregistrement ou de constante. Spécification ignorée.
* QRG5194 Gravité :  30   Nombre :    1
          Message . . . . :   Le nom entré est déjà défini comme nom de
            fichier ou de format d'enregistrement.
* QRG6048 Gravité :  30   Nombre :    1
          Message . . . . :   Le nom précisé est déjà défini comme nom de
            fichier ou d'enregistrement. La spécification n'est pas prise en
            compte.

 Nombre de messages (par ordre de gravité) :
            TOTAL    00     10     20     30     40     50
              4       0      0      0      4      0      0

 Compilation arrêtée. Erreurs de gravité 30 trouvées dans le fichier.

En RPG III, un nom de fichier, un nom de format et un nom de zone doivent être distincts : la zone ARTLIB n'était plus utilisable. Le LF a été renommé ARTICL1. Lire un listing se fait toujours de la même façon : le résumé en fin de listing donne les messages, et la marque * 4143 dans le source montre la ligne fautive.

Compiler : ce qu'il faut savoir

  • CRTRPGPGM, pas CRTBNDRPG. CRTRPGPGM crée un programme RPG/400 (OPM) ; CRTBNDRPG est le compilateur du RPG IV.
  • L'option 14 de PDM lance la même commande sur le membre choisi : avec F4, on voit l'invite de CRTRPGPGM déjà remplie.
  • OPTION(*SRCDBG) enregistre de quoi déboguer au niveau du source avec le débogueur système (STRDBG). STRISDB, lui, relit le membre source : notre HELLO recompilé en *NOSRCDBG s'y déboguait aussi, pas à pas et variables comprises. Ce qui compte pour ISDB, c'est que le membre source soit bien celui qui a été compilé.
  • GENLVL vaut 9 par défaut : un seul message de gravité 10 ou plus suffit à ne pas créer le programme (QRG9001).
  • Le listing est un spoule au nom du programme, dans la file d'attente de sortie du travail : WRKSPLF, option 5.
Invite CRTRPGPGM ouverte par l'option 14 de PDM : programme HELLO, bibliothèque JOBIR3, fichier source QRPGSRC, niveau de gravité 9
Option 14 et F4 sur HELLO : PDM remplit programme, bibliothèque, fichier et membre source.

Déboguer avec STRISDB

Pour le RPG III, le débogueur est STRISDB (ISDB, Interactive Source Debugger), qu'IBM présente comme l'environnement de débogage interactif des programmes CL, COBOL et RPG. Il affiche le source, et la ligne en cours en rouge. Déboguons SORTIE sur l'article A0002, pour une sortie de 5 :

STRISDB PGM(JOBIR3/SORTIE) UPDPROD(*YES) PARM('A0002' '00005' ' ')

ISDB appelle lui-même le programme avec ces paramètres et s'arrête avant la première instruction. Il numérote les instructions par leur numéro de séquence : la ligne 001500 est l'instruction 1500.

Le piège de UPDPROD(*NO)

Notre premier essai, avec la valeur par défaut UPDPROD(*NO), s'est arrêté net à l'ouverture du fichier :

STRISDB sur SORTIE : en ligne 24, Message non intercepté CPF4203 survenu à l'instruction .OPEN
CPF4203 : « Ouverture du membre ARTICLE impossible avec UPDPROD(*NO). »

SORTIE ouvre ARTICLE en mise à jour, et JOBIR3 est une bibliothèque de production : CRTLIB crée par défaut des bibliothèques TYPE(*PROD). Par prudence, le débogage interdit d'y modifier les fichiers. Le message propose lui-même le remède : UPDPROD(*YES). Sur une vraie machine, on débogue de préférence sur une copie des données.

Point d'arrêt, exécution, variables

ToucheRôleCe qu'elle fait
F6Point d'arrêtPose ou enlève un point d'arrêt sur la ligne où se trouve le curseur (sur le texte de la ligne, pas dans la marge).
F17ExécuterLance le programme jusqu'au prochain point d'arrêt, ou jusqu'à la fin.
F5Pas à pasExécute une instruction et s'arrête sur la suivante.
F11VariableAffiche la zone sous le curseur : type, longueur et valeur.
F23Modifier variableChange la valeur d'une zone pendant l'arrêt, pour forcer un cas.
F3 ou F12SortieOuvre la fenêtre « Fin de session ISDB ».

Curseur sur le test du stock (1500), F6, puis F17 : le programme lit l'article et s'arrête.

STRISDB arrêté à l'instruction 1500, la ligne QTE IFGT ARTSTK surlignée en rouge
Arrêt à l'instruction 1500 : le CHAIN a eu lieu, le test du stock va s'exécuter.

Curseur sur ARTSTK, F11 : l'article A0002 a 1 200 pièces en stock.

Écran Variables de programme : ARTSTK, type CONDENSEE, longueur 7 0, valeur 1200
ARTSTK vaut 1200. « Condensée » est le décimal condensé, le P des DDS.

F5 avance d'une instruction : 1800 (la soustraction), puis 1900 (UPDAT), puis 2000. Le stock est passé à 1 195, et la table le confirme après la fin du programme.

STRISDB en pas à pas, arrêté à l'instruction 1800, la ligne SUB QTE ARTSTK
F5 : 5 n'est pas supérieur à 1200, on passe dans le ELSE, à la soustraction.

Forcer un cas avec F23

Comment voir la branche « stock insuffisant » sans fabriquer de données ? On relance le programme (la fenêtre de fin propose « 2=Redémarrer programme » et garde le point d'arrêt), et à l'arrêt en 1500, F23 change ARTSTK en 3 :

Fenêtre Modifier une variable de STRISDB : variable ARTSTK, valeur 3
F23 : ARTSTK reçoit 3, en mémoire seulement.
STRISDB arrêté à l'instruction 1600, MOVE INS PRET, après la modification d'ARTSTK
F5 : 5 est supérieur à 3, le programme part en 1600 et renvoie INS.

Le programme ne réécrit rien dans cette branche : après coup, A0002 a toujours 1 195 pièces. Le débogueur a servi à tester un cas rare sans toucher au fichier.

Fenêtre Fin du programme de STRISDB : Action 1=Arrêter ISDB, 2=Redémarrer programme
En fin de programme : arrêter ISDB, ou redémarrer le programme.

STRDBG est le débogueur des programmes ILE : voir le même débogage en RPG IV. Pour le RPG III, STRISDB reste l'outil qui suit le source RPG/400 tel qu'il est écrit.

Tester : des cas écrits à l'avance

Le débogueur montre ce que fait le programme ; un test vérifie qu'il fait ce qui est attendu, et se rejoue après chaque modification. Pour SORTIE, trois cas suffisent à couvrir ses trois codes retour. Le programme de test est un CL qui appelle SORTIE, compare le code retour à l'attendu et compte les échecs :

/* TSTSORTIE : teste SORTIE sur trois cas, résultat attendu connu */
             PGM
             DCL        VAR(&RET) TYPE(*CHAR) LEN(3)
             DCL        VAR(&ECHECS) TYPE(*DEC) LEN(3 0) VALUE(0)
             DCL        VAR(&ECHECA) TYPE(*CHAR) LEN(3)

/* Cas 1 : article connu, stock suffisant : OK attendu */
             CALL       PGM(SORTIE) PARM('A0001' '00010' &RET)
             IF         COND(&RET *NE 'OK ') THEN(CHGVAR +
                          VAR(&ECHECS) VALUE(&ECHECS + 1))
             SNDPGMMSG  MSG('Cas 1 A0001 x 10 : attendu OK, obtenu ' +
                          *CAT &RET)

/* Cas 2 : article inconnu : INC attendu */
             CALL       PGM(SORTIE) PARM('Z9999' '00001' &RET)
             IF         COND(&RET *NE 'INC') THEN(CHGVAR +
                          VAR(&ECHECS) VALUE(&ECHECS + 1))
             SNDPGMMSG  MSG('Cas 2 Z9999 x 1 : attendu INC, obtenu ' +
                          *CAT &RET)

/* Cas 3 : stock insuffisant (A0004 est à zéro) : INS attendu */
             CALL       PGM(SORTIE) PARM('A0004' '00001' &RET)
             IF         COND(&RET *NE 'INS') THEN(CHGVAR +
                          VAR(&ECHECS) VALUE(&ECHECS + 1))
             SNDPGMMSG  MSG('Cas 3 A0004 x 1 : attendu INS, obtenu ' +
                          *CAT &RET)

             CHGVAR     VAR(&ECHECA) VALUE(&ECHECS)
             SNDPGMMSG  MSG('TSTSORTIE terminé, cas en échec : ' *CAT +
                          &ECHECA)
             ENDPGM
CRTCLPGM PGM(JOBIR3/TSTSORTIE) SRCFILE(JOBIR3/QCLSRC)
CALL TSTSORTIE
Écran Entrée de commandes après CALL TSTSORTIE : cas 1 attendu OK obtenu OK, cas 2 attendu INC obtenu INC, cas 3 attendu INS obtenu INS, cas en échec 000
Les trois cas réussis : « cas en échec : 000 ».

Le code retour ne suffit pas : il faut aussi regarder les données. Avant et après le test, puis après la session de débogage :

ArticleAu départAprès TSTSORTIEAprès STRISDBPourquoi
A0001500490490Cas 1 : sortie de 10.
A0002120012001195Sortie de 5 dans le débogueur ; le 2e passage (forcé en INS) ne réécrit rien.
A0004000Cas 3 : refusé, stock inchangé.
SELECT * FROM JOBIR3.ARTICLE ORDER BY ARTCOD
  • Remettre les données dans leur état de départ avant de rejouer le test : le cas 1 consomme du stock à chaque passage.
  • Un écran se teste en le déroulant : pour ARTCON, un code connu, un code inconnu, un début de libellé et une recherche vide, comme sur les quatre captures plus haut.
  • Rejouer les tests après chaque modification, avant de livrer : c'est ce qui évite la régression.

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. Create RPG/400 Program (CRTRPGPGM), IBM, IBM i 7.5 CL commands. Les options de liste *SRCDBG et *LSTDBG (l'une ou l'autre), le niveau de gravité GENLVL (9 par défaut), le fichier source QRPGSRC par défaut.
  2. 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.
  3. Start Source Entry Utility (STRSEU), IBM, IBM i 7.5 CL commands. L'éditeur de source en 5250.
  4. 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…).
  5. Create Display File (CRTDSPF), IBM, IBM i 7.5 CL commands. La création du fichier écran à partir de ses DDS.
  6. Create Library (CRTLIB), IBM, IBM i 7.5 CL commands. TYPE(*PROD) par défaut : une bibliothèque neuve est une bibliothèque de production.
  7. Create CL Program (CRTCLPGM), IBM, IBM i 7.5 CL commands. La compilation du programme de test en CL (OPM).
  8. IBM RPG, Wikipédia (en anglais). RPG III sur le System/38, RPG/400 sur l'AS/400, RPG IV en 1994.
  9. 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 III sur IBM i ?

Avec la commande CRTRPGPGM (Créer un programme RPG/400), par exemple CRTRPGPGM PGM(MABIB/HELLO) SRCFILE(MABIB/QRPGSRC), ou avec l'option 14 de PDM sur le membre source. Les fichiers décrits en externe (PF, LF, écrans) doivent être créés avant le programme. CRTBNDRPG est le compilateur du RPG IV (ILE), pas du RPG III.

Quel débogueur utiliser pour un programme RPG III ?

STRISDB, le débogueur source interactif (ISDB), qui affiche le source RPG/400 et permet de poser des points d'arrêt (F6), d'avancer pas à pas (F5), d'afficher (F11) et de modifier (F23) une variable. ISDB relit le membre source : il doit être celui qui a été compilé.

Pourquoi STRISDB affiche-t-il CPF4203 à l'ouverture d'un fichier ?

Parce que le fichier est ouvert en mise à jour alors que le débogage interdit de modifier les fichiers des bibliothèques de production, ce qui est le cas par défaut avec UPDPROD(*NO). Une bibliothèque créée par CRTLIB est de type *PROD par défaut. Relancez avec UPDPROD(*YES).

Pourquoi un littéral RPG III est-il limité à 8 caractères ?

Parce que le facteur 1 occupe les colonnes 18 à 27 et le facteur 2 les colonnes 33 à 42 : dix positions, apostrophes comprises. Un texte plus long se construit dans une zone par MOVEL et MOVE, ou se place dans une constante nommée ou un tableau.

Peut-on donner le même nom à un fichier et à une zone en RPG III ?

Non. Un nom de fichier, de format et de zone doivent être distincts : un LF nommé ARTLIB avec une zone ARTLIB fait échouer la compilation (QRG4143, QRG5194 et QRG6048, gravité 30).