Mise à niveau RPG

 

Free Form RPG : évolution majeure du RPG en V7


Cette évolution est apportée par la PTF SI51094 (il faut aussi la SF99701 level 26 pour le SQLRPGLE)


Cette mise à jour apporte un format libre complet : plus de spécifications H, F, D et P.


Plus besoin de /free /end-free, les colonnes 6 et 7 à blanc suffisent.


  on peut mixer (est-ce une bonne pratique ?) :

     read fichier;
C           MOVEA   *ALL'0'        *IN      
     exfmt ecran;
     IF *in03;  
        .....        


Donc les colonnes 6 et 7, sont encore réservées :

Le type de source reste RPGLE ou SQLRPGLE

Avec la TR3 et SI58137 (7.2) ou SI58136 (7.1) vous pouvez maintenant

  1. placer **FREE en début de source et commencer colonne1
  2. utiliser des sources de plus de 80 colonnes


Spécif H


Spécif F


Spécif D



DCL-DS nom-de-ds EXT EXTNAME('MAREFERENCE') END-DS;

DCL-DS nom-de-ds LIKEDS(autreds) ;

   remarquez qu'il n'y a pas de END-DS avec LIKEDS et LIKEREC.


Comparaison de deux membres sources appelant l'Api: QzipZip, le pgm se nomme QZIP

Dpath_fmt DS TEMPLATE qualified D CCSID 10I 0 inz D pays 2 inz(*ALLx'00') D langage 3 inz(*ALLx'00') D reserve1 3 inz(*ALLx'00') D typ_indicateur 10I 0 inz(0) D path_len 10I 0 D path_delimiter 2 inz('/') D reserve2 10 inz(*ALLx'00') D path_name 1024
D chemin_in       DS                  likeds(path_fmt) inz(*LIKEDS)
D chemin_out      DS                  likeds(path_fmt) inz(*LIKEDS)
DZipoption        DS                  qualified
D verbose                       10    inz('*NONE')
D subtree                        6    inz('*ALL')
D comment                      512
D comment_lg                    10U 0
DerrcodeDS        ds                  qualified
d  tailleDS                     10i 0 inz(0)
d  taille                       10i 0
d  msgID                         7
d  reserve                       1
d  errdta                       50
D QZIPZIP         PR                  EXTPROC('QzipZip')
D  chemin_inp                         likeds(path_fmt)
D  chemin_outp                        likeds(path_fmt)
D  format                        8    const
D  optionp                            likeds(zipoption)
D  error                              likeds(errcodeds)
          
 * paramètres en entrée
DQZIP             PI                  EXTPGM('QZIP')
D chemin                        32
D result                        32

/free chemin_in.path_name = chemin; chemin_in.path_len = %len(%trimr(chemin)); chemin_out.path_name = result; chemin_out.path_len = %len(%trimr(result)); zipoption.comment = 'Zipé par 5770SS1 , V7'; zipoption.comment_lg = %len(%trimr(zipoption.comment));
  Qzipzip(chemin_in : chemin_out : 'ZIP00100' : zipoption : errcodeds);
  *inLR = *on;
 /end-free 
Dcl-Ds path_fmt TEMPLATE qualified;
         CCSID           Int(10)    inz;
         pays            Char(2)    inz(*ALLx'00');
         langage         Char(3)    inz(*ALLx'00');
         reserve1        Char(3)    inz(*ALLx'00');
         typ_indicateur  Int(10)    inz(0);
         path_len        Int(10);
         path_delimiter  Char(2)    inz('/');
         reserve2        Char(10)   inz(*ALLx'00');
         path_name       Char(1024);
End-Ds;  
Dcl-Ds chemin_in  likeds(path_fmt)  inz(*LIKEDS);
Dcl-Ds chemin_out likeds(path_fmt)  inz(*LIKEDS);          
 Dcl-Ds Zipoption qualified;
         verbose         Char(10)   inz('*NONE');
         subtree         Char(6)    inz('*ALL');
         comment         Char(512);
         comment_lg      Uns(10);
End-Ds;          
Dcl-Ds errcodeDS qualified;
        tailleDS        Int(10)     inz(0);
        taille          Int(10);
        msgID           Char(7);
        reserve         Char(1);
        errdta          Char(50);
End-Ds;          
Dcl-Pr QZIPZIP EXTPROC('QzipZip');
         chemin_inp      likeds(path_fmt);
         chemin_outp     likeds(path_fmt);
         format          Char(8) const;
         optionp         likeds(zipoption);
         error           likeds(errcodeds);
End-Pr;          
 //  paramètres en entrée
Dcl-Pi QZIP EXTPGM('QZIP');
        chemin          Char(32);
        result          Char(32);
End-Pi;
chemin_in.path_name = chemin; chemin_in.path_len = %len(%trimr(chemin)); chemin_out.path_name = result; chemin_out.path_len = %len(%trimr(result)); zipoption.comment = 'Zipé par 5770SS1 , V7'; zipoption.comment_lg = %len(%trimr(zipoption.comment));
 Qzipzip(chemin_in : chemin_out : 'ZIP00100' : zipoption : errcodeds);   
 *inLR = *on;          

Spécifs C en format libre
 
 il s'agit de ligne blanches (sans la lettre C en colonne 6)

Expressions :
 
  • chaînes de caractères:
 
   + = concatenation entre deux chaînes
 
 •  variables numériques
 
   + , - , * , / = addition , soustraction, multiplication , division
 
   **      = élévation à la puissance

   +=  ou  -= pour ajouter ou soustraire à la valeur
 
 •  tests logiques
 
     = , >= , > , <= , < , <>        (EQ, GE, GT, LE, LT, NE)
      AND , OR , NOT, (, )            (et, ou, non)
 
  un indicateur représente déja un test logique

 

 

Pour les ordres acceptés en format libre la règle est la suivante :

ordre(option) [facteur1] facteur2 ;


[ CHAIN nocli clientf1 ]

[ READ(N) clientf1 ]

les ordres invalides en format libre on été substitués soit par une fonction intégrée (souvent nouvelle en V5R10) ,
soit sont considérés comme des ordres devenus obsolètes avec le temps (GOTO, MOVE, SETON, BITOFF)

Prototypes/Interface de Procédures

-> L'ordre CALL n'existe plus en format libre


Il faut à la place déclarer le programme et ses paramètres, cela s'appelle un PROTOTYPE.


avant, en spécif D, PR indique qu'il s'agit d'un prototype (même positions que DS) -> En free-form RPG, DCL-PR





Exemple avec un pgm utilisé an tant que web service





Enfin, un prototype peut faire référence à un programme externe ou à une procédure

Une procédure peut être comme un sous-programme ou externalisée dans un objet *SRVPGM

Elle possède ses propres variables (locales) et ses propres déclarations de fichier (DCL-F)

Dans ce dernier cas

  • les entrées/sorties doivent être impérativement réalisées à l'aide de DS.
  • les fichiers sont fermés automatiquement à la fin de la procédure,
      sauf à utiliser STATIC, qui garde les fichiers ouverts.

Spécif P

Comparaisons