Aller au contenu
Coder sur IBM i · 3 / 4 · **FREE

Coder en RPG full free, sans une seule colonne à compter

Les trois mêmes programmes, cette fois en **FREE : du code qui commence en colonne 1, des déclarations DCL-F, DCL-PI et DCL-S, des instructions terminées par un point-virgule. Compilés par CRTBNDRPG, débogués dans STRDBG et testés sur un IBM i 7.5.

1colonne de départ : la première
4lignes pour le Hello world
0indicateur dans SORTIE
3/3cas de test réussis

En une phrase

Un source full free commence par la ligne **FREE : tout le code qui suit est en format libre, de la colonne 1 jusqu'au bout de la ligne, sans aucune spécification en colonnes. C'est toujours du RPG IV : même compilateur (CRTBNDRPG), même débogueur (STRDBG).

Préparer l'atelier

Une bibliothèque JOBIRF, les mêmes fichiers source, les mêmes DDS que pour le RPG III et le RPG IV colonné. Le membre RPG reste de type RPGLE. IBM présente **FREE parmi les nouveautés de la 7.3.

CRTLIB    LIB(JOBIRF) TEXT('job-i.fr : coder en RPG full free')
CRTSRCPF  FILE(JOBIRF/QRPGLESRC) RCDLEN(92)
CRTSRCPF  FILE(JOBIRF/QDDSSRC) RCDLEN(92)
CRTSRCPF  FILE(JOBIRF/QCLSRC) RCDLEN(92)
ADDLIBLE  JOBIRF

IBM indique qu'en full free il n'y a pas de limite pratique à la longueur d'une ligne. Dans un membre, c'est la longueur d'enregistrement du fichier source qui limite : avec 92, une ligne garde 80 caractères, largement assez ici.

Et SEU ?

SEU ouvre le membre, mais à partir de la colonne 6, comme pour tout source RPG : le code full free, qui commence en colonne 1, apparaît amputé de ses cinq premiers caractères.

SEU sur le membre full free SORTIE : colonnes 6 à 76, les débuts de ligne sont coupés (RTIE au lieu de SORTIE, ARTICLE usage au lieu de dcl-f ARTICLE)
Colonnes 6 à 76 : « dcl-f ARTICLE » devient « ARTICLE », « // SORTIE » devient « RTIE ».

F19 décale l'affichage vers la gauche et rend le code lisible. Mais il suffit de retaper une ligne valide et d'appuyer sur Entrée pour que SEU la refuse :

SEU en colonnes 1 à 71 : la ligne dcl-f ARTICLE usage(*update) keyed; est surlignée et SEU affiche Type de spécification de procédure principale incorrect ou hors séquence
« Type de spécification de procédure principale incorrect ou hors séquence. » sur une ligne que le compilateur accepte.

À la sortie, SEU signale des erreurs de syntaxe dans le membre et propose de revenir à l'édition. Le programme, lui, compile sans erreur. SEU n'est donc plus l'outil pour écrire du full free : on l'écrit dans un éditeur qui connaît le format libre, puis on compile de la même façon.

Programme 1 Hello world

Hello world : quatre lignes

**FREE
// HELLO : le premier programme en RPG full free
dsply 'Hello world !';
*inlr = *on;
**FREE
Obligatoire sur la première ligne, en colonne 1 : il annonce un source entièrement libre.
// HELLO : …
Un commentaire, jusqu'à la fin de la ligne.
dsply 'Hello world !';
Le littéral directement dans l'instruction, sans zone intermédiaire.
*inlr = *on;
Toujours LR pour terminer, sans EVAL. La casse est libre.
CRTBNDRPG PGM(JOBIRF/HELLO) SRCFILE(JOBIRF/QRPGLESRC) DBGVIEW(*SOURCE)
CALL HELLO
Écran Entrée de commandes : après CALL HELLO, le message DSPLY Hello world ! apparaît
Le même message qu'en RPG III et en RPG IV colonné.

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

Sortir du stock un article lu par sa clé

**FREE
// SORTIE : sortie de stock d'un article, sans ecran.
// Parametres : code article, quantite (5 chiffres),
// code retour : OK, INC (inconnu), INS (stock insuffisant)
dcl-f ARTICLE usage(*update) keyed;

dcl-pi *n;
  pCode char(5);
  pQteA char(5);
  pRet char(3);
end-pi;

dcl-s qte packed(5:0);

qte = %dec(pQteA:5:0);
chain pCode ARTICLE;
if not %found(ARTICLE);
  pRet = 'INC';
elseif qte > ARTSTK;
  pRet = 'INS';
else;
  ARTSTK -= qte;
  update ARTICLR;
  pRet = 'OK ';
endif;
*inlr = *on;
dcl-f ARTICLE usage(*update) keyed;
Le fichier, ouvert en mise à jour, lu par la clé. Le format (ARTICLR) et les zones (ARTCOD, ARTLIB, ARTSTK) viennent des DDS, comme avant.
dcl-pi *n; … end-pi;
Les trois paramètres reçus par le programme, avec leur type.
chain pCode ARTICLE; et if not %found(ARTICLE);
Lecture par la clé, puis test du résultat par %found.
ARTSTK -= qte;
Soustraction et affectation en une instruction.

Du colonné au libre, ligne à ligne

RPG IV colonnéFull freeRemarque
FARTICLE UF E K DISKdcl-f ARTICLE usage(*update) keyed;DISK et décrit en externe sont les valeurs par défaut. En colonnes, U permet aussi de supprimer ; en libre, il faut ajouter *DELETE à usage.
DSORTIE PIdcl-pi *n; … end-pi;L'interface du programme ; *N évite de répéter son nom.
D PCode 5ApCode char(5);Un paramètre : le type s'écrit en toutes lettres.
DQte S 5P 0dcl-s qte packed(5:0);Une zone simple.
C EVAL ARTSTK = ARTSTK - QteARTSTK -= qte;Plus d'EVAL, et l'opérateur -= existe.
C PCode CHAIN ARTICLEchain pCode ARTICLE;Le facteur 1 vient juste après le code opération.
CRTBNDRPG PGM(JOBIRF/SORTIE) SRCFILE(JOBIRF/QRPGLESRC) DBGVIEW(*SOURCE)

Programme 3 Un écran, un PF et un LF

Consulter un article par son code ou par son libellé

Toujours l'écran ARTECR et le LF ARTICL1 de la page RPG III. Trois dcl-f, et la logique du RPG IV colonné, sans les colonnes :

**FREE
// ARTCON : consultation d'un article par son code (PF)
// ou par le debut de son libelle (LF). F3 pour sortir.
dcl-f ARTECR workstn;
dcl-f ARTICLE keyed;
dcl-f ARTICL1 keyed;

dow not *in03;
  exfmt ECRAN;
  if *in03;
    leave;
  endif;
  *in41 = *off;
  *in42 = *off;
  if ECODE <> *blanks;
    // Un code : acces direct par la cle du PF
    chain ECODE ARTICLE;
    *in41 = not %found(ARTICLE);
  else;
    // Sinon : positionnement dans le LF, puis lecture
    setll ERECH ARTICL1;
    read ARTICL1;
    *in42 = %eof(ARTICL1);
  endif;
  // Rien trouve : on vide la fiche
  if *in41 or *in42;
    clear ARTCOD;
    clear ARTLIB;
    clear ARTSTK;
  endif;
enddo;
*inlr = *on;
dcl-f ARTECR workstn;
L'écran : WORKSTN suffit, le fichier est alors en entrée et sortie.
dcl-f ARTICLE keyed;
Sans usage, un fichier DISK est en lecture seule.
*in41 = not %found(ARTICLE);
Les indicateurs 41 et 42 restent ceux des DDS : ils conditionnent les messages de l'écran.
CRTPF     FILE(JOBIRF/ARTICLE) SRCFILE(JOBIRF/QDDSSRC)
CRTLF     FILE(JOBIRF/ARTICL1) SRCFILE(JOBIRF/QDDSSRC)
CRTDSPF   FILE(JOBIRF/ARTECR) SRCFILE(JOBIRF/QDDSSRC)
CRTBNDRPG PGM(JOBIRF/ARTCON) SRCFILE(JOBIRF/QRPGLESRC) DBGVIEW(*SOURCE)
CALL ARTCON
Écran ARTCON en full free : début de libellé C saisi, l'article A0004 Clou 50 mm s'affiche
Libellé « C » : le même écran, le même article, en full free.

Déboguer avec STRDBG

Comme en RPG IV colonné : STRDBG, points d'arrêt, F12, puis l'appel. STRDBG affiche le source libre tel qu'il est écrit, numéroté ligne par ligne.

STRDBG PGM(JOBIRF/SORTIE) UPDPROD(*YES)
BREAK 19
CALL SORTIE PARM('A0002' '00005' ' ')
ENDDBG
Écran Source d'un module de STRDBG : le source full free de SORTIE, lignes 1 à 15, de **FREE à qte = %dec(pQteA:5:0);
Le source full free dans STRDBG.

Cette fois, le point d'arrêt est posé par une commande : BREAK 19 sur la ligne de commande du débogueur, au lieu de F6.

STRDBG : la commande BREAK 19 a été saisie, message Point d'arrêt ajouté à la ligne 19
BREAK 19 : « Point d'arrêt ajouté à la ligne 19. »
STRDBG arrêté à la ligne 19, elseif qte > ARTSTK;
L'appel s'arrête sur elseif qte > ARTSTK;.
Commande ou toucheRésultat relevé
EVAL ARTSTKARTSTK = 0001200.
F10, trois fois« Etape terminée à la ligne 21 », puis 22, puis 23
EVAL ARTSTK en ligne 23ARTSTK = 0001195.
Second appel, EVAL ARTSTK = 3ARTSTK = 3 = 0000003.
F10« Etape terminée à la ligne 20 » : la branche pRet = 'INS'
STRDBG arrêté à la ligne 23 update ARTICLR, en bas de l'écran ARTSTK = 0001195.
Juste avant update ARTICLR;, ARTSTK vaut 1 195.
STRDBG après EVAL ARTSTK = 3 et F10 : Etape terminée à la ligne 20, pRet = INS
ARTSTK forcé à 3 : le programme passe en ligne 20 et renverra INS, sans réécrire le fichier.

Tester

Le même CL de test, compilé par CRTBNDCL, sur la bibliothèque JOBIRF :

CRTBNDCL PGM(JOBIRF/TSTSORTIE) SRCFILE(JOBIRF/QCLSRC) DBGVIEW(*SOURCE)
CALL TSTSORTIE
Écran Entrée de commandes après CALL TSTSORTIE dans JOBIRF : les trois cas obtiennent le code attendu, cas en échec 000
Trois cas sur trois, comme en RPG III et en RPG IV colonné.

Les trois versions passent le même test et laissent le même stock : A0001 à 490, A0002 à 1 195 (après le débogage), A0004 à 0. Trois écritures du même programme, un seul comportement : c'est ce que le test permet d'affirmer.

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 Source Entry Utility (STRSEU), IBM, IBM i 7.5 CL commands. L'éditeur de source en 5250.
  2. 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.
  3. Create Bound CL Program (CRTBNDCL), IBM, IBM i 7.5 CL commands. La compilation du programme de test en CL ILE.
  4. Start Debug (STRDBG), IBM, IBM i 7.5 CL commands. Le débogueur des programmes ILE et le paramètre UPDPROD.
  5. 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.
  6. 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.
  7. 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

Qu'est-ce que le RPG full free ?

C'est un source RPG dont la première ligne est **FREE : tout le code est en format libre, peut commencer en colonne 1 et aller jusqu'au bout de la ligne. Les déclarations s'écrivent DCL-F, DCL-S, DCL-PI, les calculs se terminent par un point-virgule.

Peut-on éditer du RPG full free avec SEU ?

On peut ouvrir le membre, mais SEU l'affiche à partir de la colonne 6 et signale une erreur de syntaxe sur des lignes pourtant valides. Mieux vaut un éditeur qui connaît le format libre.

Comment déboguer un programme RPG full free ?

Avec STRDBG, comme tout programme ILE : compilez avec DBGVIEW(*SOURCE), lancez STRDBG, posez un point d'arrêt par F6 ou par la commande BREAK suivie du numéro de ligne, puis appelez le programme.

Que remplace DCL-PI *N ?

L'interface de la procédure principale, c'est-à-dire les paramètres reçus par le programme. Elle remplace le *ENTRY PLIST du RPG III ; *N évite de répéter le nom du programme.