Moder­ni­ser votre code RPG avec Agi­li­té – Par­tie 4

Moder­ni­ser votre code RPG avec Agi­li­té – Par­tie 4

mer 21 juillet 2021 3 Par Ibmiiste
Moder­ni­ser votre code RPG avec Agi­li­té – Introduction
Moder­ni­ser votre code RPG avec Agi­li­té – Par­tie 1
Moder­ni­ser votre code RPG avec Agi­li­té – Par­tie 2
Moder­ni­ser votre code RPG avec Agi­li­té – Par­tie 3
Moder­ni­ser votre code RPG avec Agi­li­té – Par­tie 4

Com­ment se pas­ser des KLIST en Free-form ? Introduction. 

Nous sou­hai­tons pas­ser en free-form com­plet avec **FREE en pre­mière ligne. Pro­blème ! Le source que nous avons sous les yeux a des KLIST en guide de clef de lec­ture des fichiers en accès natif. Et il n’y a pas d’ou­til gra­tuit à votre connais­sance pour le faire automatiquement.

Qu’à cela ne tienne, une tech­nique que j’u­ti­lise est de se ser­vir de DS décla­ré en LIKEREC basé sur la clef du fichier auquel nous sou­hai­tons accéder.

Pour mon propre usage, je me suis aidé de cet article chez rpgpgm.com :

Voi­ci à quoi res­semble une KLIST :

     C     K_TAB         KLIST
     C                   KFLD                    CSCPRM
     C                   KFLD                    CSCCOD
  • Ligne 1, cette fonc­tion­na­li­té du RPG colon­né, per­met de consti­tuer la clef d’ac­cès, la KLIST à un fichier en natif en y lis­tant dans l’ordre les variables à utiliser. 
  • Ligne 2, CSCPRM est la 1re variable qui consti­tue la clef
  • Ligne 3, CSCCOD est la 2me variable qui consti­tue la clef. 

Et voi­ci com­ment 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é­dem­ment décla­rés et ali­men­tés de valeurs.

KLIST n’existe plus en Free-form, il faut trou­ver une solu­tion de rem­pla­ce­ment. En fait, nous en avons 2 :

  1. la Data struc­ture clef
  2. la liste de champs clef

La DATA STRUCTURE clef

Dans le cas de la DATA STRUCTURE clef, nous allons décla­rer une DS qui fait réfé­rence à la clef d’un for­mat d’un index, d’un logique ou d’un phy­sique avec clef.

Exemple avec le fichier logique BNTABL02 dont voi­ci 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écla­ra­tion Dcl-ds uti­lise le mot-clef Like­rec avec en option *Key, cela indique à la décla­ra­tion que la DS est consti­tuée des champs clef du for­mat BNTABF appar­te­nant 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 lec­ture de fichier avec clef, nous écri­vons l’o­pé­ra­tion 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 paren­thèse indique d’u­ti­li­ser comme clef le conte­nu de la DS pour la lecture.

Il est pos­sible d’in­di­quer à l’o­pé­ra­teur de lec­ture de n’u­ti­li­ser qu’une par­tie 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 para­mètre 1 a été ajou­té, il indique à l’o­pé­ra­teur CHAIN de n’u­ti­li­ser que CSCPRM comme clef.

La liste de CHAMPS clef

Dans ce cas, nous allons allons uti­li­ser de façon expli­cite les champs clefs dans les ordres d’ac­cè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écla­ra­tion des variables.
  • Ligne 5–6, affec­tion de valeurs aux variables. 
  • Ligne 7, les variables uti­li­sés comme clef sont expli­ci­te­ment écrit dans l’opération.