
Moderniser votre code RPG avec Agilité – Partie 2
mar 23 juin 2020Du RPG IV colonné au Free-form 1re étape la fonction intégrée à RDI
Pour passer du RPG IV issu de la partie 2 au Free-form, il est nécessaire de passer par plusieurs étapes : nous allons décrire ici celle de la fonction présente dans RDI
Dans Rdi, utiliser la fonction Source–>Convertir tout au format libre.
Contrairement à ce que le nom de la fonction pourrait nous faire penser, la conversion n’est pas complète. Seule les lignes « Calculation » sont convertis mais pas toutes. Les mot-clefs qui n’ont pas de correspondance en Free-form restent tel-que.
Si nous reprenons le source résultat du billet précédent :
H
* FICHIER CLIENT
*---------------
FBNCLTL01 IF E K DISK
*
* ADRESSE CLIENT
*---------------
FBACLTL02 IF E K DISK
*----------------------------------------------------*
* PARAMETRES
*----------------------------------------------------*
C *ENTRY PLIST
C PARM $ODCLI 8
C MOVE $ODCLI CODCLI
*----------------------------------------------------
* CLES
*----------------------------------------------------
*
C CLTL02 KLIST
C KFLD CODCLI
C KFLD ACATEG
*----------------------------------------------------
* INITIALISATIONS
*----------------------------------------------------
C Z-ADD 20 SATJOU
C Z-ADD UYEAR AATJOU
C Z-ADD UMONTH MATJOU
C Z-ADD UDAY JATJOU
C MOVE '/' SLASH1
C MOVE '/' SLASH2
C MOVE '-' TIRET1
C MOVE '/' SLASH3
* RECHERCHE CLIENT I
C CODCLI CHAIN BNCLTL01 60
* RECHERCHE ADRESSE CLI I
C MOVE 'CLI' ACATEG
C CLTL02 CHAIN BACLTL02 60
C N60NIDEAD CHAIN BACISL01 60
C *IN60 IFEQ '0'
C MOVE ALIGN3 CLIGN3
C MOVE ALIGN4 CLIGN4
C MOVE ALIGN5 CLIGN5
C MOVE ALIGN6 CLIGN6
C ENDIF
Cela donne
H
// FICHIER CLIENT
//---------------
FBNCLTL01 IF E K DISK
//
// ADRESSE CLIENT
//---------------
FBACLTL02 IF E K DISK
//----------------------------------------------------*
// PARAMETRES
//----------------------------------------------------*
C *ENTRY PLIST
C PARM $ODCLI 8
C MOVE $ODCLI CODCLI
//----------------------------------------------------
// CLES
//----------------------------------------------------
//
C CLTL02 KLIST
C KFLD CODCLI
C KFLD ACATEG
//----------------------------------------------------
// INITIALISATIONS
//----------------------------------------------------
C Z-ADD 20 SATJOU
C Z-ADD UYEAR AATJOU
C Z-ADD UMONTH MATJOU
C Z-ADD UDAY JATJOU
C MOVE '/' SLASH1
C MOVE '/' SLASH2
C MOVE '-' TIRET1
C MOVE '/' SLASH3
// RECHERCHE CLIENT I
/FREE
CHAIN CODCLI BNCLTL01;
*IN60 = NOT %FOUND;
// RECHERCHE ADRESSE CLI I
/END-FREE
C MOVE 'CLI' ACATEG
/FREE
CHAIN CLTL02 BACLTL02;
*IN60 = NOT %FOUND;
/END-FREE
C N60NIDEAD CHAIN BACISL01 60
/FREE
IF *IN60 = '0';
/END-FREE
C MOVE ALIGN3 CLIGN3
C MOVE ALIGN4 CLIGN4
C MOVE ALIGN5 CLIGN5
C MOVE ALIGN6 CLIGN6
/FREE
ENDIF;
/END-FREE
Comme vous pouvez le voir, certaines lignes ne sont pas convertis :
- les déclarations autre que « Calculations » (F, D, H etc…),
Pour les transformer en format libre, vous pouvez utiliser le plugin JCRCMDS pour RDI ou la version par commande.
- la déclaration des paramètres (*ENTRY), nous aurions dû avoir une « Procédure Interface Definition » (Dcl-pi),
- Ici nous aurions :
Dcl-pi Liste_des_client Extpgm('LSTCLT');
$Codcli Char(8);
End-pi;
- Les opérateurs MOVE, Z‑ADD,
- Move sera remplacé par des combinaisons d’Eval, Evalr et éventuellement une %BIF.
- L’usage d’indicateur dans les colonnes 9, 10 et 11 etc… pourra être remplacé par des indicateurs nommés, plus clair.
- Les déclarations de clef KLIST ne sont pas transformés
Nous verrons dans d’autres billets ces cas particuliers.
Autre exemple, la gestion d’un sous-fichier de clients
H DEBUG DECEDIT('0,') DATEDIT(*DMY.)
F**********************************************************************
F* CC 01/01/2009
F* Liste du personnel
F**********************************************************************
F* Déclaration des fichiers
FPGMF01FM CF E WORKSTN
F SFILE(SFL01 :WRAN01)
F INFDS(DSSFL1)
FFIC02L IF E K DISK
F INFDS(FIC)
F* Déclaration des variables
DWDAT S 8
DWHEU S 6
DW14 S 14 0
DWSNOM S 35
DWSNOP S 35
DI S 3 0
D* La DS du programme, noter le S indispensable
DDSPROG SDS
DWNPROG 1 10
DWSTATP 11 15 0
DWSTAPR 16 20 0
DWSQSRC 21 28
DWSBROU 29 36
DWNPARM 37 39 0
DWTYEXC 40 42
DWNMSGM 40 46
DWNMEXC 43 46
DWINSMC 47 50
DWZOMSG 51 80
DWLBPGM 81 90
DWSFDTA 91 170
DWCDERR 171 174
DWLSFIL 201 208
DWLSINF 209 243
DWJOB 244 253
DWUSER 254 263
DWNJOB 264 269 0
D* La DS du sous=fichier
DDSSFL1 DS
DWPOSC 370 371B 0
DWRRNG 376 377B 0
DWRNGP 378 379B 0
DWNBRSF 380 381B 0
D* La DS du fichier
DFIC DS
DWNRC01 397 400B 0
DWDSFIC DS
DWCDFIL 1 8
DWOPENF 9 9
DWSTSFI 11 15 0
DWOPCOD 16 21
DWRPGSQ 30 37
DWRPGNR 38 45
DWERRFI 46 52
DWNFICH 83 92
DWNLIBR 93 102
DWSPNAM 103 112
DWSPLIB 113 122
DWSPNUM 123 124B 0
DWLIMBR 129 138
DWNBPUT 243 246B 0
DWNBGET 247 250B 0
DWNBPG 251 254B 0
DWNBIO 255 258B 0
DWRCDFT 261 270
DWNBRCD 283 286B 0
DWNRCFI 397 400B 0
C* la clé d'accés au fichier
C KEY001 KLIST
C KFLD FIFON
C KFLD FINOM
C* le nombre de lignes afichables, déclaration a la volée
C Z-ADD 14 NBLIS1 4 0
C* initialisation des variables générales
C MOVEL WNPROG ZPGM
C EXSR DATHEU
C MOVE WDAT ZDATE
C MOVE WHEU ZHEUR
C MOVEL WUSER ZUSER
C MOVEL WJOB ZJOB
C* Initialisation du sous=fichier des messages
C MOVEL '* ' WPGMQ
C MOVEL 'CC01' WMGKEY
C SETON 0910
C* Indicateur fin
C SETON 50
C* Debut du traitement,
C EXSR INITSF
C* Boucle d'attente de sortie
C DOW *IN50 = '1'
C EXSR TRTSFL
C END
C* Indicateur de fin de programme
C SETON LR
C* Les procédures
C* Traitement de l'écran
C TRTSFL BEGSR
C* Effacement du sous=fichier de messages
C MOVEL '3' PTYP
C MOVEL *BLANK PFIM
C MOVEL *BLANK PMID
C CALL 'PGM001CL'
C PARM PTYP 1
C PARM PFIM 10
C PARM PMID 7
C PARM PMDT 99
C WRITE WSFCTL
C* Ecriture de l'écran
C SETON 0405
C WRITE FORE1 70
C WRITE FORB1
C* Attente lecture
C READ FORE1 70
C* Une touche a été actionnée
C* Chargement de l'heure
C TIME ZHEUR
C* Indicateur pour ne pas tester d'autres actions
C SETON 51
C IF *IN02 = '1'
C* page suivante
C EXSR CHGPAG
C SETOFF 51
C END
C*
C 51 IF WSNOP <> ZSNOM
C* Test si selection/ si changé on initialise
C EXSR INITSF
C SETOFF 51
C END
C* touches F3 et F12
C IF *INKC = '1' OR
C *INKL = '1'
C* on met l'indicateur à Off = fin du programme
C SETOFF 5051
C END
C*
C IF *INKE = '1'
C* F5 Rafraichissement de l'écran
C EXSR INITSF
C SETOFF 51
C END
C*
C IF *INKF = '1'
C* F6 création d'un nouveau matricule
C MOVEL 'CR' PCHX
C MOVEL *BLANK NREC
C CALL 'PGMF02'
C PARM PCHX 2
C PARM NREC 10
C EXSR INITSF
C SETOFF 51
C END
C IF *INKH = '1'
C* F8 impression du fichier
C MOVEL *BLANK PMAT
C* On appelle le CL de routage sans soumission, sinon PGMF20CL
C CALL 'PGMF2SCL'
C PARM PMAT 10
C SETOFF 51
C END
C* On ne fait ceci que s'il n'y a eu rien d'autre
C IF *IN51 = '1'
C EXSR TRTOPT
C END
C* On recommence la boucle d'attente
C ENDSR
C* Initialisation du sous-fichier
C INITSF BEGSR
C* l'indicateur 20 conditionne la zone OPT (protection)
C SETOFF 20
C* Initialisation de la variable de sélection
C MOVEL ZSNOM WSNOP
C MOVEL *BLANK WSNOM
C* Initialisation de la clé pour positionnement
C MOVEL *BLANK FIFON
C MOVEL *BLANK FINOM
C SETOFF 8485
C IF ZSNOM <> *BLANK
C* Si différent de blank il y a selection
C SETON 84
C Z-ADD 0 I
C '*' SCAN ZSNOM I 85
C IF I > 0
C I SUB 1 I
C I SUBST (P) ZSNOM:1 WSNOM 90
C* On est dans le cas d'une sélection générique
C SETON 85
C* On se positionnera juste au bon endroit dans le fichier
C MOVEL WSNOM FINOM
C END
C END
C* La dernière ligne écrite
C Z-ADD 0 LSTLIG 4 0
C* Le compteur de ligne par page
C Z-ADD 0 NBRLIG 4 0
C* Le fameux WRAN01
C Z-ADD 0 WRAN01 4 0
C* Effacement du sous=fichier
C SETON 0607
C SETOFF 0405
C WRITE FORE1
C SETOFF 06
C SETON 0405
C* Positionnement en début de fichier
C KEY001 SETLL FICF 70
C* Chargement de la première page
C EXSR CHGPAG
C ENDSR
C* Traitement des options, on ne lit que les enregistrements modifiés
C TRTOPT BEGSR
C* Lecture des enregistrements modifiés
C Z-ADD 1 WRAN01
C* Top pour rafraichir l'écran, si besoin
C SETOFF 86
C N70 READC SFL01 7070
C*
C *IN70 DOWEQ '0'
C MOVE HNREC NREC
C IF HTOUT = '1'
C IF ZOPT='2' OR ZOPT='3' OR ZOPT='4' OR ZOPT='99'
C* Si l'employé à quitté on ne peut plus rien modifier
C MOVE '5 ' ZOPT
C END
C END
C SETON 85
C* Selection en fonction du choix saisi
C SELECT
C WHEN (ZOPT = '2') OR (ZOPT = ' 2')
C MOVEL 'MO' PCHX
C WHEN (ZOPT = '3') OR (ZOPT = ' 3')
C MOVEL 'CO' PCHX
C WHEN (ZOPT = '4') OR (ZOPT = ' 4')
C MOVEL 'SU' PCHX
C WHEN (ZOPT = '5') OR (ZOPT = ' 5')
C MOVEL 'AF' PCHX
C WHEN (ZOPT = '6') OR (ZOPT = ' 6')
C MOVE HMATR PMAT
C CALL 'PGMF2SCL'
C PARM PMAT 10
C SETOFF 85
C WHEN (ZOPT = '99')
C MOVEL 'PE' PCHX
C OTHER
C* La saisie ne correspond à rien
C SETOFF 85
C* Envoyer un message pour dire que l'option n'existe pas
C MOVEL '1' PTYP
C MOVEL 'FICMSG ' PFIM
C MOVEL 'MSG0002' PMID
C CALL 'PGM001CL'
C PARM PTYP 1
C PARM PFIM 10
C PARM PMID 7
C PARM PMDT 99
C ENDSL
C IF HTOUT = '0'
C* Pour ne pas perdre l'attribut couleur
C SETOFF 30
C ELSE
C SETON 30
C END
C* Nettoyage
C MOVEL *BLANK ZOPT
C UPDATE SFL01 90
C* On aurait pu aussi faire IF..., en tout cas le choix est bon
C 85 CALL 'PGMF02'
C PARM PCHX 2
C PARM NREC 10
C 85 SETON 86
C* On continue de boucler si autre option
C READC SFL01 7070
C END
C* Potentiellement il y a eu mise à jour, on pourrait affiner
C 86 EXSR INITSF
C ENDSR
C* Chargement d'une page
C CHGPAG BEGSR
C* Il faut positionner correctement les indicateurs et les variables
C SETOFF 08
C* SETON 04
C Z-ADD LSTLIG WRAN01
C* Lexture de l'enregistrement suivant
C READ FICF 70
C* Remise à zéro du compteur de ligne, mais on pourrait faire autrement
C Z-ADD 0 NBRLIG 4 0
C*
C *IN70 DOWEQ '0'
C NBRLIG ANDLT 14
C* Remplissage des zones écran
C SETON 86
C* Test s'il y a selection
C IF *IN84 = '1' OR *IN85 = '1'
C IF *IN84 = '1' AND *IN85 = '0'
C* On recherche la stricte égalité de nom
C IF FINOM <> ZSNOM
C SETOFF 86
C END
C ELSE
C* On recherche si le nom commence par la valeur avant le '*'
C I SUBST (P) FINOM:1 WXNOM 35 90
C* Petite entorse de flemmard WXNOM est déclarée au fil de l'eau
C IF WXNOM <> WSNOM
C SETOFF 86
C END
C END
C END
C* L'indicateur est à '1' si sélection OK ou pas de sélection
C IF *IN86 = '1'
C MOVEL FINOM ZNOM
C MOVEL FIPR1 ZPR1
C MOVEL FIFON ZFONC
C Z-ADD FIMAT ZMATR
C MOVEL FICPO ZCPO
C MOVEL FIC WDSFIC
C Z-ADD WNRCFI HNREC
C MOVE FIMAT HMATR
C IF FIDAS = 0
C* Top salarié licencié
C MOVE '0' HTOUT
C SETOFF 30
C ELSE
C MOVE '1' HTOUT
C SETON 30
C END
C* Les compteurs, attention au WRAN01
C ADD 1 NBRLIG
C ADD 1 LSTLIG
C ADD 1 WRAN01
C* Ecriture de la ligne
C WRITE SFL01
C END
C* Lecture du suivant
C READ FICF 70
C END
C* On quitte la boucle soit en fin de page
C* soit en fin de fichier
C *IN70 IFEQ '1'
C* Le caractère de suite, on est en fin de fichier
C SETON 07
C ELSE
C SETOFF 07
C END
C* Si le fichier est vide
C WRAN01 IFEQ 0
C Z-ADD 1 NBRLIG
C Z-ADD 1 LSTLIG 4 0
C* Un petit message
C Z-ADD 1 WRAN01
C* Pas de saisie d'option
C SETON 20
C IF ZSNOM = *BLANK
C* Si on a un vieil AS400 du siècle dernier
C MOVEL 'Fic. Vide' ZNOM
C ELSE
C* En RPG ILE
C eval ZNOM = 'Sélection Vide'
C END
C* Ne pas oublier de remettre à blanc
C MOVEL *BLANK ZPR1
C MOVEL *BLANK ZFONC
C Z-ADD 0 ZMATR
C MOVEL *BLANK ZCPO
C MOVEL *BLANK WDSFIC
C Z-ADD 0 HNREC
C* Ecriture du message sur la première ligne
C WRITE SFL01
C END
C* le WRAN01 à 1 pour afficher le premier enregistrement
C* Z-ADD LSTLIG WRAN01
C ENDSR
C* Lecture date et heure systeme
C DATHEU BEGSR
C TIME W14
C MOVE W14 WDAT
C MOVEL W14 WHEU
C ENDSR
Après application de l’option de conversion en format libre de RDI, nous obtenons :
H DEBUG DECEDIT('0,') DATEDIT(*DMY.)
//*********************************************************************
// CC 01/01/2009
// Liste du personnel
//*********************************************************************
// Déclaration des fichiers
FPGMF01FM CF E WORKSTN
F SFILE(SFL01 :WRAN01)
F INFDS(DSSFL1)
FFIC02L IF E K DISK
F INFDS(FIC)
// Déclaration des variables
DWDAT S 8
DWHEU S 6
DW14 S 14 0
DWSNOM S 35
DWSNOP S 35
DI S 3 0
// La DS du programme, noter le S indispensable
DDSPROG SDS
DWNPROG 1 10
DWSTATP 11 15 0
DWSTAPR 16 20 0
DWSQSRC 21 28
DWSBROU 29 36
DWNPARM 37 39 0
DWTYEXC 40 42
DWNMSGM 40 46
DWNMEXC 43 46
DWINSMC 47 50
DWZOMSG 51 80
DWLBPGM 81 90
DWSFDTA 91 170
DWCDERR 171 174
DWLSFIL 201 208
DWLSINF 209 243
DWJOB 244 253
DWUSER 254 263
DWNJOB 264 269 0
// La DS du sous=fichier
DDSSFL1 DS
DWPOSC 370 371B 0
DWRRNG 376 377B 0
DWRNGP 378 379B 0
DWNBRSF 380 381B 0
// La DS du fichier
DFIC DS
DWNRC01 397 400B 0
DWDSFIC DS
DWCDFIL 1 8
DWOPENF 9 9
DWSTSFI 11 15 0
DWOPCOD 16 21
DWRPGSQ 30 37
DWRPGNR 38 45
DWERRFI 46 52
DWNFICH 83 92
DWNLIBR 93 102
DWSPNAM 103 112
DWSPLIB 113 122
DWSPNUM 123 124B 0
DWLIMBR 129 138
DWNBPUT 243 246B 0
DWNBGET 247 250B 0
DWNBPG 251 254B 0
DWNBIO 255 258B 0
DWRCDFT 261 270
DWNBRCD 283 286B 0
DWNRCFI 397 400B 0
// la clé d'accés au fichier
C KEY001 KLIST
C KFLD FIFON
C KFLD FINOM
// le nombre de lignes afichables, déclaration a la volée
C Z-ADD 14 NBLIS1 4 0
// initialisation des variables générales
C MOVEL WNPROG ZPGM
/FREE
EXSR DATHEU;
/END-FREE
C MOVE WDAT ZDATE
C MOVE WHEU ZHEUR
C MOVEL WUSER ZUSER
C MOVEL WJOB ZJOB
// Initialisation du sous=fichier des messages
C MOVEL '* ' WPGMQ
C MOVEL 'CC01' WMGKEY
/FREE
*IN09 = *ON;
*IN10 = *ON;
// Indicateur fin
*IN50 = *ON;
// Debut du traitement,
EXSR INITSF;
// Boucle d'attente de sortie
DOW *IN50 = '1';
EXSR TRTSFL;
ENDDO;
// Indicateur de fin de programme
*INLR = *ON;
// Les procédures
// Traitement de l'écran
BEGSR TRTSFL;
// Effacement du sous=fichier de messages
/END-FREE
C MOVEL '3' PTYP
C MOVEL *BLANK PFIM
C MOVEL *BLANK PMID
C CALL 'PGM001CL'
C PARM PTYP 1
C PARM PFIM 10
C PARM PMID 7
C PARM PMDT 99
/FREE
WRITE WSFCTL;
// Ecriture de l'écran
*IN04 = *ON;
*IN05 = *ON;
WRITE FORE1;
*IN70 = %EOF;
WRITE FORB1;
// Attente lecture
READ FORE1;
*IN70 = %EOF;
// Une touche a été actionnée
// Chargement de l'heure
/END-FREE
C TIME ZHEUR
// Indicateur pour ne pas tester d'autres actions
/FREE
*IN51 = *ON;
IF *IN02 = '1';
// page suivante
EXSR CHGPAG;
*IN51 = *OFF;
ENDIF;
//
/END-FREE
C 51 IF WSNOP <> ZSNOM
// Test si selection/ si changé on initialise
/FREE
EXSR INITSF;
*IN51 = *OFF;
ENDIF;
// touches F3 et F12
IF *INKC = '1' OR
*INKL = '1';
// on met l'indicateur à Off = fin du programme
*IN50 = *OFF;
*IN51 = *OFF;
ENDIF;
//
IF *INKE = '1';
// F5 Rafraichissement de l'écran
EXSR INITSF;
*IN51 = *OFF;
ENDIF;
//
IF *INKF = '1';
// F6 création d'un nouveau matricule
/END-FREE
C MOVEL 'CR' PCHX
C MOVEL *BLANK NREC
C CALL 'PGMF02'
C PARM PCHX 2
C PARM NREC 10
/FREE
EXSR INITSF;
*IN51 = *OFF;
ENDIF;
IF *INKH = '1';
// F8 impression du fichier
/END-FREE
C MOVEL *BLANK PMAT
// On appelle le CL de routage sans soumission, sinon PGMF20CL
C CALL 'PGMF2SCL'
C PARM PMAT 10
/FREE
*IN51 = *OFF;
ENDIF;
// On ne fait ceci que s'il n'y a eu rien d'autre
IF *IN51 = '1';
EXSR TRTOPT;
ENDIF;
// On recommence la boucle d'attente
ENDSR;
// Initialisation du sous-fichier
BEGSR INITSF;
// l'indicateur 20 conditionne la zone OPT (protection)
*IN20 = *OFF;
// Initialisation de la variable de sélection
/END-FREE
C MOVEL ZSNOM WSNOP
C MOVEL *BLANK WSNOM
// Initialisation de la clé pour positionnement
C MOVEL *BLANK FIFON
C MOVEL *BLANK FINOM
/FREE
*IN84 = *OFF;
*IN85 = *OFF;
IF ZSNOM <> *BLANK;
// Si différent de blank il y a selection
*IN84 = *ON;
/END-FREE
C Z-ADD 0 I
C '*' SCAN ZSNOM I 85
/FREE
IF I > 0;
/END-FREE
C I SUB 1 I
C I SUBST (P) ZSNOM:1 WSNOM 90
// On est dans le cas d'une sélection générique
/FREE
*IN85 = *ON;
// On se positionnera juste au bon endroit dans le fichier
/END-FREE
C MOVEL WSNOM FINOM
/FREE
ENDIF;
ENDIF;
// La dernière ligne écrite
/END-FREE
C Z-ADD 0 LSTLIG 4 0
// Le compteur de ligne par page
C Z-ADD 0 NBRLIG 4 0
// Le fameux WRAN01
C Z-ADD 0 WRAN01 4 0
// Effacement du sous=fichier
/FREE
*IN06 = *ON;
*IN07 = *ON;
*IN04 = *OFF;
*IN05 = *OFF;
WRITE FORE1;
*IN06 = *OFF;
*IN04 = *ON;
*IN05 = *ON;
// Positionnement en début de fichier
SETLL KEY001 FICF;
*IN70 = %EQUAL;
// Chargement de la première page
EXSR CHGPAG;
ENDSR;
// Traitement des options, on ne lit que les enregistrements modifiés
BEGSR TRTOPT;
// Lecture des enregistrements modifiés
/END-FREE
C Z-ADD 1 WRAN01
// Top pour rafraichir l'écran, si besoin
/FREE
*IN86 = *OFF;
/END-FREE
C N70 READC SFL01 7070
//
/FREE
DOW *IN70 = '0';
/END-FREE
C MOVE HNREC NREC
/FREE
IF HTOUT = '1';
IF ZOPT='2' OR ZOPT='3' OR ZOPT='4' OR ZOPT='99';
// Si l'employé à quitté on ne peut plus rien modifier
/END-FREE
C MOVE '5 ' ZOPT
/FREE
ENDIF;
ENDIF;
*IN85 = *ON;
// Selection en fonction du choix saisi
SELECT;
WHEN (ZOPT = '2') OR (ZOPT = ' 2');
/END-FREE
C MOVEL 'MO' PCHX
/FREE
WHEN (ZOPT = '3') OR (ZOPT = ' 3');
/END-FREE
C MOVEL 'CO' PCHX
/FREE
WHEN (ZOPT = '4') OR (ZOPT = ' 4');
/END-FREE
C MOVEL 'SU' PCHX
/FREE
WHEN (ZOPT = '5') OR (ZOPT = ' 5');
/END-FREE
C MOVEL 'AF' PCHX
/FREE
WHEN (ZOPT = '6') OR (ZOPT = ' 6');
/END-FREE
C MOVE HMATR PMAT
C CALL 'PGMF2SCL'
C PARM PMAT 10
/FREE
*IN85 = *OFF;
WHEN (ZOPT = '99');
/END-FREE
C MOVEL 'PE' PCHX
/FREE
OTHER;
// La saisie ne correspond à rien
*IN85 = *OFF;
// Envoyer un message pour dire que l'option n'existe pas
/END-FREE
C MOVEL '1' PTYP
C MOVEL 'FICMSG ' PFIM
C MOVEL 'MSG0002' PMID
C CALL 'PGM001CL'
C PARM PTYP 1
C PARM PFIM 10
C PARM PMID 7
C PARM PMDT 99
/FREE
ENDSL;
IF HTOUT = '0';
// Pour ne pas perdre l'attribut couleur
*IN30 = *OFF;
ELSE;
*IN30 = *ON;
ENDIF;
// Nettoyage
/END-FREE
C MOVEL *BLANK ZOPT
/FREE
UPDATE(E) SFL01;
*IN90 = %ERROR;
// On aurait pu aussi faire IF..., en tout cas le choix est bon
/END-FREE
C 85 CALL 'PGMF02'
C PARM PCHX 2
C PARM NREC 10
C 85 SETON 86
// On continue de boucler si autre option
/FREE
READC(E) SFL01;
*IN70 = %ERROR OR %EOF;
ENDDO;
// Potentiellement il y a eu mise à jour, on pourrait affiner
/END-FREE
C 86 EXSR INITSF
/FREE
ENDSR;
// Chargement d'une page
BEGSR CHGPAG;
// Il faut positionner correctement les indicateurs et les variables
*IN08 = *OFF;
// SETON 04
/END-FREE
C Z-ADD LSTLIG WRAN01
// Lexture de l'enregistrement suivant
/FREE
READ FICF;
*IN70 = %EOF;
// Remise à zéro du compteur de ligne, mais on pourrait faire autrement
/END-FREE
C Z-ADD 0 NBRLIG 4 0
//
/FREE
DOW *IN70 = '0'
AND NBRLIG < 14;
// Remplissage des zones écran
*IN86 = *ON;
// Test s'il y a selection
IF *IN84 = '1' OR *IN85 = '1';
IF *IN84 = '1' AND *IN85 = '0';
// On recherche la stricte égalité de nom
IF FINOM <> ZSNOM;
*IN86 = *OFF;
ENDIF;
ELSE;
// On recherche si le nom commence par la valeur avant le '*'
/END-FREE
C I SUBST (P) FINOM:1 WXNOM 35 90
// Petite entorse de flemmard WXNOM est déclarée au fil de l'eau
/FREE
IF WXNOM <> WSNOM;
*IN86 = *OFF;
ENDIF;
ENDIF;
ENDIF;
// L'indicateur est à '1' si sélection OK ou pas de sélection
IF *IN86 = '1';
/END-FREE
C MOVEL FINOM ZNOM
C MOVEL FIPR1 ZPR1
C MOVEL FIFON ZFONC
C Z-ADD FIMAT ZMATR
C MOVEL FICPO ZCPO
C MOVEL FIC WDSFIC
C Z-ADD WNRCFI HNREC
C MOVE FIMAT HMATR
/FREE
IF FIDAS = 0;
// Top salarié licencié
/END-FREE
C MOVE '0' HTOUT
/FREE
*IN30 = *OFF;
ELSE;
/END-FREE
C MOVE '1' HTOUT
/FREE
*IN30 = *ON;
ENDIF;
// Les compteurs, attention au WRAN01
/END-FREE
C ADD 1 NBRLIG
C ADD 1 LSTLIG
C ADD 1 WRAN01
// Ecriture de la ligne
/FREE
WRITE SFL01;
ENDIF;
// Lecture du suivant
READ FICF;
*IN70 = %EOF;
ENDDO;
// On quitte la boucle soit en fin de page
// soit en fin de fichier
IF *IN70 = '1';
// Le caractère de suite, on est en fin de fichier
*IN07 = *ON;
ELSE;
*IN07 = *OFF;
ENDIF;
// Si le fichier est vide
IF WRAN01 = 0;
/END-FREE
C Z-ADD 1 NBRLIG
C Z-ADD 1 LSTLIG 4 0
// Un petit message
C Z-ADD 1 WRAN01
// Pas de saisie d'option
/FREE
*IN20 = *ON;
IF ZSNOM = *BLANK;
// Si on a un vieil AS400 du siècle dernier
/END-FREE
C MOVEL 'Fic. Vide' ZNOM
/FREE
ELSE;
// En RPG ILE
ZNOM = 'Sélection Vide';
ENDIF;
// Ne pas oublier de remettre à blanc
/END-FREE
C MOVEL *BLANK ZPR1
C MOVEL *BLANK ZFONC
C Z-ADD 0 ZMATR
C MOVEL *BLANK ZCPO
C MOVEL *BLANK WDSFIC
C Z-ADD 0 HNREC
// Ecriture du message sur la première ligne
/FREE
WRITE SFL01;
ENDIF;
// le WRAN01 à 1 pour afficher le premier enregistrement
// Z-ADD LSTLIG WRAN01
ENDSR;
// Lecture date et heure systeme
BEGSR DATHEU;
/END-FREE
C TIME W14
C MOVE W14 WDAT
C MOVEL W14 WHEU
/FREE
ENDSR;
/END-FREE
Dans les prochains billets, ce source va continuer d’être travaillé pour observer ensemble l’évolution vers la forme libre que j’appelle complète.
[…] Moderniser votre code RPG avec Agilité – Partie 2 […]
[…] Moderniser votre code RPG avec Agilité – Partie 2 […]