Codes opération RPG-IV ER =Erreur FD =Found NF =not found B = blanc NR =no record EOF =end of file BOF =begin ........................................................................... : f = /free : une colonne à blanc= non renseignable : : accepté. : renseignée = obligatoire, ( ) = facultatif : ........................................................................... : Code : Facteur 1 : Facteur 2 : zone result : > : < : = : :...........:.................:.................:.............:...:...:...: :f ACQ : nom d'unité : fichier WORKSTN : : :ER : : : ADD : (zone) : zone : somme : + : - : 0 : : ADDDUR : date/heure : durée:code : date/heure : :ER : : : ALLOC : : longueur : pointeur : :ER : : : ANDxx : opérande : opérande : : : : : :f BEGSR : sous-pgm : : : : : : : CABxx : opérande : opérande : label : > : < : = : : CALL : : nom de pgm : (plist) : :ER :LR : : CALLB(D) : : procedure/point.: (plist) : :ER :LR : : CASxx : opérande : opérande : sous-pgm : > : < : = : : CAT(P) : chaîne-1 : chaîne-2(:nb' '): chaîne-3 : : : : :f CHAIN(N) : argument : fichier ou fmt : (DS) :NR :ER : : :...........:.................:.................:.............:...:...:...: |
........................................................................... : Code : Facteur 1 : Facteur 2 : zone result : > : < : = : :...........:.................:.................:.............:...:...:...: : CHECK : chaîne : argument(:pos) : (position) : :ER :FD : : CHECKR : chaîne : argument(:pos) : (position) : :ER :FD : :f CLEAR : (*NOKEY) : structure/fmt : : : : : :f CLOSE : : fichier/*ALL : : :ER : : :f COMMIT : (frontière) : : : :ER : : : COMP : opérande : opérande : : > : < : = : :f DEALLOC(N) : : pointeur : :ER : : : DEFINE : *LIKE : zone référencée : zone définie: : : : : " " : *DTAARA : nom data-area : nom-pgm : : : : :f DELETE : (argument) : nom fichier : :NR :ER : : : DIV(H) : divisé : diviseur : quotient : > : < : = : : DO : val-départ : val-limite : index : : : : : DOUxx : opérande : opérande : : : : : : DOWxx : opérande : opérande : : : : : :f DSPLY : message-id : message-queue : (réponse) : :ER : : :f ELSE : : : : : : : :f ELSEIF : : : : : : : : END : : incrément (do) : : : : : :...........:.................:.................:.............:...:...:...: |
........................................................................... : Code : Facteur 1 : Facteur 2 : zone result : > : < : = : ........................................................................... : ENDCS : : : : : : : :f ENDDO : : incrément : : : : : :f ENDIF : : : : : : : :f ENDSL : : : : : : : :f ENDSR : (label)) : (retour) : : : : : :f EXCEPT : : nom-specif O : : : : : :f EXFMT : : format : : :ER : : :f EXSR : : sous-programme : : : : : : EXTRCT : : date/heure:code : résultat : : : : :f FEOD : : fichier : : :ER : : : GOTO : : label : : : : : : IFxx : opérande : opérande : :NR :ER : : :f IN : (*LOCK) : data area : : :ER : : :f ITER : : : : : : : : KFLD : : : zone clé : : : : : KLIST : nom-klist : : : : : : :f LEAVE : : : : : : : :f LEAVESR : : : : : : : ........................................................................... |
........................................................................... : Code : Facteur 1 : Facteur 2 : zone result : > : < : = : ........................................................................... : LOOKUP : (tableau) : argument : tableau : > : < : = : :f MONITOR : : : : : : : : MOVE(P) : (fmt date/heure): origine : résultat : + : - :0,B: : MOVEL(P) : (fmt date/heure): origine : résultat : + : - :0,B: : MOVEA : : zone/tableau : zone/tableau: + : - :0,B: : MULT : multiplié : multiplicateur : résultat : + : - :0,B: : MVR : : : reste : + : - :0,B: : OCCUR : (occurence) : nom DS : (résultat) : :ER : : :f OPEN : : fichier : : :ER : : :f ON-ERROR : : code(s) erreur : : : : : : ORxx : opérande : opérande : : : : : :f OTHER : : : : : : : :f OUT : (*LOCK) : data area : : :ER : : : PARM : (retour) : (envoi) : paramètre : : : : : PLIST : nom plist : : : : : : :f READ(N) : : fichier/fmt : (DS) : :ER :EOF: :f READC(N) : : format : : :ER :EOF: :f READE(N) : (argument) : fichier/fmt : (DS) : :ER :EOF: ........................................................................... |
........................................................................... : Code : Facteur 1 : Facteur 2 : zone result : > : < : = : ........................................................................... :f READP(N) : : fichier/fmt : (DS) : :ER :BOF: :f READPE(N): (argument) : fichier/fmt : (DS) : :ER :BOF: : REALLOC : : longueur : pointeur : :ER : : :f REL : unité : fichier : : :ER : : :f RESET : (*NOKEY) : structure/fmt : résultat : :ER : : :f RETURN : : : : : : : :f ROLBK : : : : :ER : : : SCAN : argument(:lg) : chaîne(:pos) : résultat : : :FD : :f SELECT : : : : : : : :f SETGT : argument : fichier/fmt : :NR :ER : : :f SETLL : arg(*START/*END): fichier/fmt : :NR :ER :FD : : SETOFF : : : :-- :-- :-- : : SETON : : : :-- :-- :-- : :f SORTA : : tableau : : : : : : SUB : (val.origine) : val.enlevée : résultat : : : : : SUBDUR : date/heure : durée:code : date/heure : :ER : : : ou : date/heure : date/heure : durée:code : :ER : : : SUBST(P) : lg à extraire : chaîne(:pos) : résultat : :ER : : ........................................................................... |
........................................................................... : Code : Facteur 1 : Facteur 2 : zone result : > : < : = : ........................................................................... : TAG : label : : : : : : : TESTN : : : var-char :NU :BN :BL : :f TEST(D| : format : : date ou : :ER : : : T|Z [E]): à vérifier : : char ou num.: :ER : : : TIME : : : résultat : : : : :f UNLOCK : : fichier/D-A : : :ER : : :f UPDATE : : fichier/fmt : (DS) : :ER : : : WHENxx : opérande : opérande : : : : : :f WRITE : : fichier/fmt : (DS) : :ER :EOF: : XFOOT : : tableau : somme : + : - : 0 : : XLATE : de:à : chaîne(:pos) : résultat : :ER :FD : : Z-ADD : : val. ajoutée : résultat : + : - : 0 : : Z-SUB : : val. soustraite : résultat : + : - : 0 : :...........:.................:.................:.............:...:...:...: les tests logiques "xx" sont : . EQ (=) . LT (<) . GT (>) . LE (<=) . GE (>=) . NE (<>) (N) avec DEALLOC = assignation de la valeur nulle au pointeur.(V3R70) |
Ces ordres sont valides en facteur 2 étendu ET en format libre, uniquement ........................................................................... : Code : : Facteur 2 étendu : ........................................................................... : CALLP(E) : : pgm(param1 : param2: param3 : ....) : : DOU : : (expression logique) : : DOW : : (expression logique) : : EVAL(H) : : résultat = expression en format libre : : EVALR(H) : : résultat = expression en format libre : : IF : : (expression logique) : : WHEN : : (expression logique) : : FOR : : i= départ BY incr. TO maxi | DOWNTO mini : : ENDFOR : : : : ENDIF : : : : ENDDO : : : ........................................................................... la V3R70 apporte aux ordres EVAL, EVALR les extensions M et R (M) sur un calcul = calcul avec precision maximale (R) " " = calcul avec la précision de la variable résultat la V4R20, l'option E, offrant une gestion d'erreur à l'instruction |
........................................................................... : Proposition de remplacement des codes invalides en format libre : ........................................................................... : Code : remplacement : Exemple : :...........:.................:.................:.............:...:...:...: : ADD : + : EVAL A = A +1 ou A = A+1 ou A+=1 : : ADDDUR : + : datliv = datcmd + %DAYS(45) : : ALLOC : %Alloc : : : ANDxx : (test libre) : if A=B AND compteur<>0 : : CABxx : : : : CALL : CALLP + EXTPGM : CALLP pgmA (parm1 : parm2) : : CALLB(D) : CALLP + EXTPROC : " : : CASxx : IF / EXSR : : : CAT(P) : + : Message = 'date de traitement' + DATCHAR : : CHECK : %check : pos = %check('0123456789-+,' : qtechar) : : CHECKR : %checkr : " : : COMP : IF : : : DEFINE : *LIKE : déclaration en D avec LIKE( ) : : " " : *DTAARA : déclaration en D avec DTAARA( ) : : DIV(H) : / : : : DO : FOR départ : for i=1 to 50 : :...........:.................:.................:.............:...:...:...: |
........................................................................... : Code : remplacement : Exemple : ........................................................................... : DOUxx : DOU : DOU %eof : : DOWxx : DOW : DOW not %eof : : END : ENDxx : : : ENDCS : cf CAS : : : EXTRCT : %SUBDT : mois = %SUBDT(DATCMD : *M) : : GOTO : : : : IFxx : IF : if GAP = 4 : : KFLD : %KDS ou (K1 :K2): CHAIN (societe: nocli) clientf1 : : KLIST : : : : LOOKUP : %lookup : tva = %lookup(code : tbtva) : : MOVE(P) : conversion : datcmd = %DATE(datchar:*ISO) : : MOVEL(P) : : ou Datchar = %CHAR(datcmd), etc... : : MOVEA : (%subarr ?) : : : MULT : * : : : MVR : %rem : if %rem(AN : 4) = 0 : : OCCUR : %occur : : : ORxx : cf ANDXX : : : PARM : prototype : déclaration en spécif D pour CALLP : ........................................................................... |
........................................................................... : Code : remplacement : Exemple : ........................................................................... : PLIST : cd PARM : : : REALLOC : %reallaoc : : : SCAN : %scan : QUATRE = %scan('4' : 'RPG4') : : SETOFF : *inxx = *off : : : SETON : *inxx = *on : : : SUB : - : : : SUBDUR : - : HIER = AUJOURDHUI - %days(1) : : ou : %DIFF : UN = %DIFF(aujourdhui : hier) : : SUBST(P) : %subst : : : TAG : : : : TESTN : %CHECK : : : TIME : %DATE() %TIME() : aujourdhui = %date() : : WHENxx : WHEN : : : XFOOT : %xfoot : : : XLATE : %xlate : : : Z-ADD : eval : : : Z-SUB : eval - : : :...........:.................:.................:.............:...:...:...: |
V5R10 : nouvelle gestion des erreurs (format fixe ET format libre) MONITOR / ENDMON il s'agit de définir un groupe d'instructions devant être monitorées si une erreur survient , le contrôle est transmis au premier ON-ERROR si tout se passe normalement, on saute à l'instruction qui suit le ENDMON. ON-ERROR n° | ou n°1 : n°2 : n°3 | ou *FILE, *PROGRAM , *ALL gère une erreur spécifique ou une série d'erreurs dans un bloque MONITOR. les erreurs sont gérées dans l'ordre d'écriture, vous devez donc écrire du plus spécifique (une seule erreur) au plus large (*ALL), comme les MONMSG du CL. si une erreur survient pendant le traitement du code associé à un ordre on-error, l'erreur elle même n'est pas gérée, sauf à imbriquer MONITOR. |
/free MONITOR ; chain nocli clientf1 ; if %found ; chaine = %subst( tbl(x) : %scan('*':tbl(x)) + 1) endif; On-error 1211 ; // fichier non ouvert ... On-error *FILE ; // autres erreurs fichier ... On error 00100:00121 ; // erreur de chaîne ou d'indice .... On-error *ALL ; // autres erreurs (MONMSG CPF0000) MONITOR; .... .... ON-ERROR *ALL; ... // prb pendant le traitement de l'erreur !! ENDMON; ENDMON; /end-free |
CALLP est apparu en V3R60 et permet un appel en format libre il faut pour cela déclarer le programme et ses paramètres, avant, en spécif D, cela s'appelle un PROTOTYPE. +-----------------------------------------------------------+ ! DEXEC PR EXTPGM('QCMDEXC') ! ! D 250 const ! ! D 15P 5 const ! +-----------------------------------------------------------+ PR indique qu'il s'agit d'un prototype (même positions que DS) EXTPGM le nom du pgm externe (peut être qualifié) CONST sur un paramètre indique que ce paramètre peut NE PAS etre une variable (constante, calcul, fonction intégrée, ...) VALUE passage de paramètre par valeur (pas de valeur retour) OPTIONS(*NOPASS) ce paramètre peut ne pas etre transmis [tester le nombre de paramètres avec %parms() ] OPTIONS(*OMIT) ce paramètre peut etre omis [tester le paramètre avec %addr(param) <> *NULL] |
en free-form dcl-PR exec EXTPGM('QCMDEXC') *N char(250) const; *N packed(15 5) const; end-pr; tout cela permettant C callp exec(commande : %size(commande)) ou exec('WRKSPLF': 7) ; //ou cmd = 'wrkactjob output(*print)'; exec(cmd : %len(%trimr(cmd)) ); la réception des paramètres peut elle même être réalisée a/ soit, comme avant (*ENTRY PLIST) b/ ou en spécif D, avec protoype ET une interface de procédure ( PI ) (en version 7, L'interface de procédure seule suffit.) |
En version 5 et 6 ----------------- DProgrammeB PR EXTPGM('PGMB') D 6 0 DProgrammeB PI D nocli 6 0 En version 7 ------------ DProgrammeB PI EXTPGM('PGMB') D nocli 6 0 En version 7.2 -------------- dcl-pi ProgrammeB EXTPGM('PGMB'); nocli packed(6 0); end-pi; |
les prototypes ammènent aussi la possibilité de créer des procédures : c'est comme un sous programme, encadré par une spécif P ou DCL-PROC, avec variables locales, passage de paramètres et se terminant par RETURN Pmaprocedure B D PI D param1 6 0 D param2 10 D mavariable S 5I 0 /free ... return /end-free Pmaprocedure E vous devez aussi la déclarer en début de programme par un prototype (PR) |
les prototypes ammènent aussi la possibilité de créer des procédures : c'est comme un sous programme, encadré par une nouvelle spécif P ou DCL-PR avec variables locales, passage de paramètres et se terminant par RETURN dcl-proc maprocedure; dcl-pi *n; param1 packed(6 0); param2 char(10); end-pi; dcl-s mavariable int(5); ... return end-proc maprocedure; vous devez aussi la déclarer en début de programme par un prototype (PR) |
Exemple complet : --------------- Dmaprocedure PR D 6 0 D 10 /free // programme principal maprocedure (p1 : p2); *inlr = *on /end-free Pmaprocedure B D PI D param1 6 0 D param2 10 D mavariable S 5I 0 /free ... return /end-free Pmaprocedure E |
la procedure peut retourner une valeur, on parle alors de fonction vous devez préciser sur les lignes PR et PI,type et LG de la val. retour Dmafonction PR 1 D 6 0 D 10 (ici, 1 ALPHA) le code opération RETURN doit posséder un argument : la valeur retournée la fonction se manipule alors comme une variable x = f(y) ou bien if f(y) = 0 ou encore A = B + f(y) si vous souhaitez externaliser la fonction, il faudra impérativement utiliser ILE et la placer dans un objet *SRVPGM (programme de service), une sorte de DLL pour I5/OS. |
Exemple complet : --------------- Dmafonction PR 1 D 6 0 D 10 /free // programme principal retour = mafonction (p1 : p2); *inlr = *on /end-free Pmafonction B D PI 1 D param1 6 0 D param2 10 D mareponse S 1 /free ... return mareponse; /end-free Pmafonction E |
Exemple d'une fonction en free_from: dcl-PR Findemois DATE; // cette fonction retourne une date; *N DATE(*ISO); end-pr ; dcl-proc Findemois; // Définition de l'Interface de procédure (DCL-PI) // doit être conforme avec le prototype (vérifié à la compilation) dcl-PI *N DATE; dateIN DATE(*ISO); end-pi ; // variables locales; dcl-s Wdate DATE; //exemple : 15 avril + 1 mois => 15 Mai / -15 jours => 30 Avril wdate = DATEIN + %MONTHS(1); wdate = wdate - %days(%SUBDT(wdate:*D)); return wdate; end-proc ; |