Initiation RPG

le langage RPG est un langage ayant fortement évolué




  • GAP II sur IBM 36 : langage colonné, cycle GAP, pas d'ordre de structuration (indicateurs et GOTO)



  • GAP III sur IBM 38 langage colonné, logique libre (accès libre aux fichiers base de données), structuration (if/dowhile, ...)

    • Types de lignes (Spécif)
      • H paramètres généraux
      • F déclaration des fichiers
      • E déclaration des tableaux
      • L paramètres des états (rare)
      • I découpages des enregistrements lus
      • C traitement (Compute)
      • O découpage des lignes écrites

  • RPG/400 comme le GAP III de l'IBM 38, mais sur AS/400, intégrant le support de SQL

  • ILE RPG -IV évolution majeure en V3R10 (1995)
    • langage semi-libre (Eval ...)

      Types de lignes (Spécif)
      • H paramètres généraux
      • F déclaration des fichiers
      • D déclarations (variables / tableaux)
        • [ I découpages des enregistrements lus, plus utilisées]
      • C traitement (Compute)
        • [O découpage des lignes écrites, rarement utilisées]
      • P définition de procédure ou de fonction

    • intégration de la technologie ILE (meilleure intégration de langages différents)

  • ILE RPG-IV en format libre en V5R10 (2001)
    • codification en format libre (marqueurs /free , /end-free), remplace les spécif C.


  • V7 & TR7 (2015), dernière évolution (à ce jour ) : Free-Form RPG


Cette évolution est apportée par une PTF (SI51094)


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 :



Regardons les différentes étapes, dans l'ordre d'écriture :

• Spécif H


EN RPG III



EN RPG IV

EN Format libre

• Spécif F


EN RPG III



EN RPG IV

EN Format libre

• Spécif D

EN RPG III





EN RPG IV

EN Format libre


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.

 

• Spécif C

EN RPG III

  
 ! RPG-III !  signification     !  commentaires
 !---------!--------------------!--------------------------------------------------
 !         !                    !
 !   6     !       C            !
 !         !                    !
 !  7-8    ! Niveau de contrôle !  Lx   (Cycle)
 !         !    ou              !
 !         ! Continuation       !   AN/OR
 !         !                    !
 !  9-17   ! Conditions         !  NxxNxxNxx (un indicateur = une condition)
 !         !                    !
 ! 18-27   !  Facteur 1         ! les noms sont limités à 6c, les constantes à 10.
 !         !                    !
 ! 28-32   !  Code opération    ! L'ordre
 !         !                    !
 ! 33-42   !  Facteur 2         ! Toujours 10 positions.
 !         !                    !
 ! 43-48   !  zone résultat     ! la limite de 6c. est là
 !         !                    !
 ! 49-51   !  longueur          ! Définition de la zone résultat
 ! 52      !  nbr de décimales  !
 !         !                    ! 
 ! 53      !  options           ! H=Arrondi, N=Nolock (lecture sans verrouillage)
 !         !                    !
 ! 54-59   !  indics résultants !  >><<==
 !---------!--------------------!---------------------------------------------------
 




EN RPG IV (transition GAP3 -> GAP4)


Même logique, les colonnes sont plus larges (nom de zones sur 10c. et non 6)

  
 ! RPG-IV  !  signification     !  commentaires
 !---------!--------------------!-----------------------------------------------
 !         !                    !
 !   6     !       C            !
 !         !                    !
 !  7-8    ! Niveau de contrôle !  Lx   (Cycle)
 !         !    ou              !
 !         ! Continuation       !   AN/OR
 !         !                    !
 !  9-11   ! Conditions         !  Nxx (un indicateur = une condition)
 !         !                    !
 ! 19-25   !  Facteur 1         !  les noms sont à 14 position maxi
 !         !                    !   dans cette spécif C
 !         !                    !
 ! 26-35   !  Code opération(O) ! Options possibles :
 !         !                    !  (H) arrondi
 !         !                    !  (N) Read with no lock
 !         !                    !  (D) manipulation d'une date,(T) une heure
 !         !                    !  (Z)      "       d'un horodatage.
 !         !                    !  ! 36-49   !  Facteur 2         ! Toujours 14 positions.  !         !                    !  ! 50-63   !  zone résultat     !    "      "     "     .  !         !                    !  ! 64-68   !  longueur          ! Définition de la zone résultat  ! 69-70   !  nbr de décimales  !  !         !                    !  ! 71-76   !  indics résultants !  >><<== (99 booléens nommés de 01 à 99)  !---------!--------------------!------------------------------------------------  



  Codes opérations élémentaires :                           | remarques
                                                            |
     CL0N01Factor1+++++++Opcode&ExtFactor2+++++++Result++++++++Len++D+HiLoEq
           A             ADD        B            C          |   C = A + B
                                                            |
                (si A est omis : C = C + B                  |
                                                            |
           A             SUB        B            C          |   C = A - B
           A             MULT       B            C          |   C = A * B
           A             DIV        B            C          |   C = A / B
                         MVR                     D          |  reste dans D
                                                            |
                         MOVE       X            Y          |
 ALPHA uniquement (conseillé), sans mise à blanc, cadrage à DROITE
                                                            |
                         MOVEL      X            Y          |   move LEFT
                                                            |
                         Z-ADD      0            N          |     N = 0 
 NUMERIQUE uniquement                                       |
                         Z-SUB      1            N          |     N = -1
                                                            |
 
   CL0N01Factor1+++++++Opcode&ExtFactor2+++++++Result++++++++Len++D+HiLoEq                                                                     ^ ^ <---->   Partout la variable résultat peut être:                         ! !    ^                                                                   ! !    !                                   a/ définie          lg        --! !    !                                                     décimales   ----!    !                                                                          !                                   b/ testée      ------------------------!                                       par >,< ou =, par rapport à blanc                                                                ou zéro.     et enfin:      CL0N01Factor1+++++++Opcode&ExtFactor2+++++++Result++++++++Len++D+HiLoEq         <->          !          !--> tous les codes opération peuvent être conditionnés.(xx=vrai / Nxx=faux)  
exemple

C MOVE NOM RESULT 40
C 40 ADD 1 CPT


 Facteur 2 étendu (V3R10/1995)


 Format libre (V5R10/2001)


Pour les ordres historiques acceptés en format libre,
on passe de :

  • facteur1           ORDRE          facteur2              ZR
    à
  • ORDRE (facteur1) facteur2 ZR;



EN 2015 (TR3) avec **FREE, on peut commencer colonne 1



Chaînes et tableaux

Structuration

Entrées/Sorties


Coder en format libre



Appel de programmes CALL


Sur IBM i , un programme, quelque soit le langage, peut appeler un programme (avec passage de paramètres)


le passage de paramètres est un passage de paramètre par référence (par adresse) c.a.d en entrée/sortie


En spécif C


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

avant, en spécif D,

  +-----------------------------------------------------------+
! DEXEC PR EXTPGM('PGMB') !
! D 6P 0 const !
+-----------------------------------------------------------+ PR indique qu'il s'agit d'un prototype (même positions que DS)


Aujourd'hui :

DCL-PR nom-de-prototype;
  paramètre type mots-clés ;
END-PR [nom-de-prototype] ;

Utilisation ensuite :







La réception des paramètres peut elle-même être réalisée sur le même principe, avec une interface de procédure

DCL-PI nom-de-procédure | *N   [type de retour]
    paramètre type mots-clés ;
END-PI [nom-de-procédure] ;


Depuis la V7R10, le prototype n'est plus obligatoire pour le programme en cours

Comparaisons



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

 

                  DCL-PI interface de procédure;
                     ...
                  END-PI;

          ...
         END-PROC [nom-de-procédure] ;

Mots-clés importants


Comparaisons

Exemple de modernisation

© Volubis