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 |
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' |
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 --------------------------! |
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')) ... ! |
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 |
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 |
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 |
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 ------------------------------------! |
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 |
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) |
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 ! !<------------------------------------------! |
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. |
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. |