Moderniser votre code RPG avec Agilité – Partie 4
mer 21 juillet 2021Comment se passer des KLIST en Free-form ? Introduction.
Nous souhaitons passer en free-form complet avec **FREE en première ligne. Problème ! Le source que nous avons sous les yeux a des KLIST en guide de clef de lecture des fichiers en accès natif. Et il n’y a pas d’outil gratuit à votre connaissance pour le faire automatiquement.
Qu’à cela ne tienne, une technique que j’utilise est de se servir de DS déclaré en LIKEREC basé sur la clef du fichier auquel nous souhaitons accéder.
Pour mon propre usage, je me suis aidé de cet article chez rpgpgm.com :
Voici à quoi ressemble une KLIST :
C K_TAB KLIST C KFLD CSCPRM C KFLD CSCCOD
- Ligne 1, cette fonctionnalité du RPG colonné, permet de constituer la clef d’accès, la KLIST à un fichier en natif en y listant dans l’ordre les variables à utiliser.
- Ligne 2, CSCPRM est la 1re variable qui constitue la clef
- Ligne 3, CSCCOD est la 2me variable qui constitue la clef.
Et voici comment on l’utilise :
C K_TAB CHAIN BNTABL02 C IF %FOUND(BNTABL02) C Eval W_Vdfsdd = Csnum1 C ENDIF
- Ligne 1, le logique est lu selon la clef K_TAB qui contient les champs précédemment déclarés et alimentés de valeurs.
KLIST n’existe plus en Free-form, il faut trouver une solution de remplacement. En fait, nous en avons 2 :
- la Data structure clef
- la liste de champs clef
La DATA STRUCTURE clef
Dans le cas de la DATA STRUCTURE clef, nous allons déclarer une DS qui fait référence à la clef d’un format d’un index, d’un logique ou d’un physique avec clef.
Exemple avec le fichier logique BNTABL02 dont voici la structure :
JCRFFD File Field Description Friday 9/04/21 File: BNTABL02 BFBASE TABLES-Base détail de tables CICA00 Keys: CSCPRM CSCCOD RcdFmt: BNTABF RecLen: 254 Fields: 13 Job CCSID: 297 Search: Search Length Text Key Field Data Type Position Code Suppr CODSUP char(1) 1 1 Parm A01 CSCPRM char(5) 2 6 Code A02 CSCCOD char(10) 7 16 Libellé CSCLIB char(50) 17 66 Comments 1 CSCOM1 char(30) 67 96 Comments 2 CSCOM2 char(30) 97 126 Comments 3 CSCOM3 char(30) 127 156 Comments 4 CSCOM4 char(30) 157 186 C. Numérique 1 CSNUM1 zoned(15: 5) 187 201 C. Numérique 2 CSNUM2 zoned(15: 5) 202 216 C. Numérique 3 CSNUM3 zoned(15: 5) 217 231 C. Numérique 4 CSNUM4 zoned(15: 5) 232 246 Date CSCDTE char(8) 247 254
// Fichiers tables Dcl-f BNTABL02 keyed; ... ... ... // Clés du fichier BNTABL02 Dcl-ds K_TAB Likerec(BNTABF:*Key);
- Ligne 7, la déclaration Dcl-ds utilise le mot-clef Likerec avec en option *Key, cela indique à la déclaration que la DS est constituée des champs clef du format BNTABF appartenant au logique BNTABL02. Le DS K_TAB sera de ce type :
Dcl-ds K_TAB; CSCPRM Char(5); CSCCOD Char(10); End-ds;
Afin de faire une lecture de fichier avec clef, nous écrivons l’opération de cette façon :
K_TAB.CSCPRM = 'AMMSL'; K_TAB.CSCCOD = 'VDFSDD'; CHAIN %kds(K_TAB) BNTABL02; IF %FOUND(BNTABL02); W_Vdfsdd = Csnum1; ENDIF;
- Ligne 3, le mot-clef %kds avec la DS entre parenthèse indique d’utiliser comme clef le contenu de la DS pour la lecture.
Il est possible d’indiquer à l’opérateur de lecture de n’utiliser qu’une partie de la clef :
K_TAB.CSCPRM = 'AMMSL'; CHAIN %kds(K_TAB:1) BNTABL02; IF %FOUND(BNTABL02); W_Vdfsdd = Csnum1; ENDIF;
- Ligne 2, dans le mot-clef %Kds, un paramètre 1 a été ajouté, il indique à l’opérateur CHAIN de n’utiliser que CSCPRM comme clef.
La liste de CHAMPS clef
Dans ce cas, nous allons allons utiliser de façon explicite les champs clefs dans les ordres d’accès au fichiers/tables.
Dcl-s CSCPRM Char(5); Dcl-s CSCCOD Char(10); .. .. CSCPRM = 'AMMSL'; CSCCOD = 'VDFSDD'; CHAIN (CSCPRM:CSCCOD) BNTABL02; IF %FOUND(BNTABL02); W_Vdfsdd = Csnum1; ENDIF;
- Ligne 1–2, déclaration des variables.
- Ligne 5–6, affection de valeurs aux variables.
- Ligne 7, les variables utilisés comme clef sont explicitement écrit dans l’opération.
[…] Partie 1 Partie 2 Partie 3 Partie 4 […]
[…] Moderniser votre code RPG avec Agilité – Partie 4 […]
[…] Moderniser votre code RPG avec Agilité – Partie 4 […]