Programmation structurée en RPG/400

BoTTom |    Changer de couleur
 
                  Programmation structurée en RPG/400 
 
  But : améliorer les performances
 
                    la lisibilité (donc la maintenance)
 
        des pgm écrits en RPG/400
 
 Pour cela il faut Bannir GOTO - TAG - CABxx et tous les indicateurs en
  colonnes 7 à 15 (dans la mesure du possible)
 
 
 Utiliser les indicateurs sous la forme *INxx ou *IN,xx
                                                 (tableau de 99 postes)
    en les comparant à *ON  (vrai, = '1')
                    ou *OFF (faux, = '0')
 
 Exemple:        Facteur1++CodopFacteur2++Zrésul
                 *IN03     IFEQ *ON
 
 


|    Changer de couleur
 
                  Programmation structurée en RPG/400 
 
  Conditions : 
                           IFxx
 
 compare Facteur1 à Facteur2 avec l'opérateur xx
 
  EQ -> =   égal à                EQUAL
  NE -> <>  différent de          NOT EQUAL
  GT -> >   plus grand que        GREATER THAN
  GE -> >=  plus grand ou égal    GREATER OR EQUAL
  LT -> <   plus petit que        LESS THAN
  LE -> <=  plus petit ou égal    LESS OR EQUAL
 
 Si la condition est vraie, RPG exécute tout ce qui suit le IF jusqu'à ENDIF
                                                                   ou  ELSE
 Si la condition est fausse, RPG saute à l'instruction qui suit ENDIF
                                                             ou ELSE
  ex:            Facteur1++CodopFacteur2++Zrésul
                 CODE      IFEQ 'A'
 


|    Changer de couleur
  Exemple : 
                 Facteur1++CodopFacteur2++Zrésul
                 TOTFAC    IFGT 5000
                           ...         --!
                           ...         --!  Total > 5000,00
                           ELSE
                           ...         --!  total < ou = 5000,00
                           ...         --!
                           ENDIF
 
 Vous pouvez imbriquer des conditions
                 TOTFAC    IFGT 5000  --------------------------!
                           ...                                  ! Total >
                 CODPAI    IFEQ 'C'   ----!  total > 5000 ET    !
                           ...            !   code = 'C'        !    5000
                           ELSE       ----!                     !
                           ...            !  total > 5000 ET    !
                           ENDIF      ----!  code autre que 'C' !
                           ELSE       --------------------------!-----------
                           ...                                  ! Total < =
                           ...                                  !    5000
                           ENDIF      --------------------------!


|    Changer de couleur
 
 Vous pouvez définir des conditions complèxes en les reliant entre elles
  par OU (OR) ou bien ET (AND)
 
                           IFxx
                           ANDxx
                           ORxx
 
                           ENDIF
 
 Attention,vous ne bénificiez pas de parenthèses pour indiquer des priorités
 
 LA REGLE EST DONC LA SUIVANTE: un OU sépare des groupes de ET.
 (autrement dit vous redémarrez UNE NOUVELLE CONDITION à chaque OR.)
 
 Ce qui peut vous amener à répeter un condition dans chaque groupe de ET
 
                 MTFAC     IFGT 5000  !  MTFAC > 5000 et (CODFAC = C ou T)
                 CODFAC    ANDEQ'C'   !  se dit:
                 MTFAC     ORGT 5000  !  ((MTFAC > 5000 et CODFAC = 'C') ou 
                 CODFAC    ANDEQ'T'   !   (MTFAC > 5000 et CODFAC = 'T'))
                           ...        !


|    Changer de couleur
 
Si vous avez des conditions,mutuellement exclusives, qui s'enchainent
 vous pouvez utiliser SELEC :
 
                 Facteur1++CodopFacteur2++Zrésul
                           SELEC
                 f1        WHxx f2  ----- 1ere condition. Si vraie exécution
                           ...          !  des instructions qui suivent puis
                           ...      -----  saut à ENDSL.
                 f1        WHxx f2  -----
                           ...          ! 2eme condition (testée uniquement
                           ...      -----  si la première est fausse).Même
                           ENDSL                                    principe
 Exemple :       Facteur1++CodopFacteur2++Zrésul
                           SELEC
                 CODFAC    WHEQ 'C'
                           ...
                 CODFAC    WHEQ 'T'
                           ...
                           OTHER  <--- si tous les WHxx précédents sont faux
                           ...
                           ENDSL


|    Changer de couleur
 
 Il existe une fonction analogue avec les sous programmes:
 
                 Facteur1++CodopFacteur2++Zrésul
                 f1        CASxx f2       NOMSR
 
 Si la condition est vraie, exécution du sous programme NOMSR puis saut à
  l'instruction qui suit ENDCS.
 Sinon, instruction suivante (ne peut être que CASxx ou ENDCS)
 
 Il n'est pas possible de définir des conditions complèxes
 
 L'équivalent de OTHER s'écrit CAS  (CAS sans xx)
 
 exemple:
                 Facteur1++CodopFacteur2++Zrésul
                 CODFAC    CASEQ'C'       FACCHQ
                 CODFAC    CASEQ'T'       FACTRT
                           CAS            FACDIV
                           ENDCS
 
 


|    Changer de couleur
 
 Les boucles:  DOUxx-DOWxx-ENDDO
 
  les boucles se font par l'intermédiaire des instructions DOUxx (jusqu'à)
                                                           DOWxx (tant que)
  Différences: 
 
           DOUxx               !               DOWxx
                               !
  le test se fait sur ENDDO    ! le test se fait sur DOWxx
 (au moins une boucle)         ! (peut être exécutée 0 fois)
                               !
 on donne la condition d'arret ! on donne la condition pour boucler 
                               !
            !                  !      !-------->DOW
   !------>DOU                 !      !           ? (condition)--  
 f !        !                  !      !         v!             !f
 a !        !                  !      !         r!             !a
 u !      ENDDO                !      !         a!             !u
 s !         ? (condition)      !      !         i!             !s
 s ---------v                  !      ---------ENDDO           !s
 e           vraie             !                 !<------------!e


|    Changer de couleur
 
A noter que IF + DOU remplace avantageusement le DOW puisque cela offre les
 séquences pour placer des instructions devant se réaliser UNE FOIS en début
 de boucle, UNE FOIS en fin de boucle, et condition fausse.
 
                 COND      IFEQ VRAI  -------------------------------------
                           ...                        ! premier passage   !
                           ...        -----------------                   !
                 COND      DOUEQFAUX-----!                                !
                           ...           ! boucle                         !
                           ...           !                                !
                           ...           !                                !
                           ENDDO    -----!                                !
                           ...        ----------------                    !
                           ...                       ! dernier passage    !
                           ELSE       ------------------------------------!
                           ...                       ! condition          !
                           ...                       !  fausse            !
                           ENDIF      ------------------------------------!
 
 
 


|    Changer de couleur
 
 Vous pouvez maintenant (depuis la V2R10) sortir d'une boucle de manière
  anticipée.
                           LEAVE  permet de sortir de la boucle
                                  (saut après ENDDO)
 
                           ITER   sortie de CE TOUR de boucle
                                  (saut à ENDDO  ==> boucle suivante sera
                                                     réalisée suivant la
                                                     condition DOUxx-DOWxx.)
 Exemple:        Facteur1++CodopFacteur2++Zrésul
                 *IN90     DOUEQ*ON                  >><<==
                           READFICHIER                   90 ON = EOF
                           SELEC
                 *IN90     WHEQ *ON
                           LEAVE             --> EOF = sortie de la boucle
                 CODFAC    WHEQ 'T'
                           ITER              --> je ne traite pas code = 'T'
                           OTHER
                           ...               --> traitement d'un enreg lu.
                           ENDSL
                           ENDDO


|    Changer de couleur
 
L'ordre DO seul possède de multiples fonctionnalités:
 
  NxxNxxNxx      Facteur1++CodopFacteur2++Zrésul     >><<==
   aa            déb       DO   fin       rés
                           ...
                           ...
                           ...
   bb                      ENDDOinc
 
   aa= condition pour faire (si la condition est fausse -> saut après ENDDO)
 
   bb= condition pour boucler(si fausse, RPG ne "voit" pas ENDDO et sort)
 
   déb = valeur de début de boucle (dft = 1)
 
   fin = val de fin de boucle, Si rés > à fin -> saut après ENDDO.(dft = 1)
 
   rés = zone du pgm servant de compteur (dft = compteur interne à RPG).
 
   inc = val de l'incrément à chaque fin de boucle,avant comparaison.(dft=1)
 


|    Changer de couleur
                              DO
                           test aa ---faux----------------------------------
                               !                                           !
                           vrai!                                           !
                               v                                           !
                           rés=déb                                         !
                               !                                           !
              ---------------> v                                           !
              !            rés>fin? --oui--------------------------------->!
              !            non !                                           !
              !               ...                                          !
              !               ...                                          !
              !               ...                                          !
              !               ...                                          !
              !             test bb --faux-------------------------------->!
              !                !                                           !
              !            vrai!                                           !
              !                v                                           !
              !             rés=rés + inc                                  !
              -----------------!                                           !
                             ENDDO                                         !
                               !<------------------------------------------!


|    Changer de couleur
 Exemples : 
  NxxNxxNxx      Facteur1++CodopFacteur2++Zrésul     >><<==
 
     C   40                DO   10
                           ...            faire 10 fois si 40 est ON
                           ...
     C                     ENDDO
 
     C           2         DO   Z
                           ...            faire jusqu'à Z à partir de 2,
                           ...                            par pas de 2.
     C                     ENDDO2
 
     C                     DO   10        CPT     10
                           ...
                           ...             le pgm boucle !!!!
                           ...
     C                     ENDDO           en effet CPT va prendre toutes
                                            les valeurs de 1 à 9 puis va
                                            repasser à 0 (9+1 dans 1 dt 0)
                                           ==> RPG ne contrôle pas votre
                                                compteur.


|    Changer de couleur
 
 Et n'oubliez pas les sous programmes (meilleure lisibilité)
 
                           EXSR SP1      exécute SP1 puis reprend à
                            ...           l'instruction qui suit EXSR.
                            ...
                 SP1       BEGSR         Les variables sont communes au pgm
                            ...           principal et aux sous programmes
                           ENDSR          (ce n'est pas le cas de tous les
                                                                  langages)
 
 Pour tous ces codes opération le ENDyy est facultatif (sauf ENDSR)
  vous pouvez utiliser END seul. (les ENDyy n'existaient pas avant la V2R10)
 
 Cependant ENDyy facilite la lisibilité et le contrôle en cas d'erreur à la
  compilation.
 
 
 Pour une plus grande lisibilité de vos listes de compil. utilisez le
  paramètre INDENT de la commande CRTRPGPGM.
 
 





©AF400