
Mémo RPG-IV
exemple :
C |
V7R20
Vous pouvez commencer colonne 1, dépasser la colonne 80
Tout le code doit être en format libre
exemple :
**free |
les codes opération suivants NE peuvent PAS être saisie en format libre (voir nos propositions de remplacement)
| ADD | ADDDUR | ALLOC | ANDxx | BITOFF | BITON |
| CABxx | CALL | CALLB | CAS | CAT | CHECK |
| CHECKR | COMP | DEFINE | DIV | DO | DOUxx |
| DOWxx | END | EXTRCT | GOTO | IFxx | KFLD |
| KLIST | LOOKUP | MHHZO | MHLZO | MLHZO | MLLZO |
| MOVE | MOVEL | MULT | MVR | OCCUR | ORxx |
| PARM | PLIST | REALLOC | SCAN | SETOFF | SETON |
| SHTDN | SQRT | SUB | SUBDR | SUBST | TAG |
| TESTB | TESTN | TESTZ | TIME | WHENxx | XFOOT |
| XLATE | Z-ADD | Z-SUB |
les codes opération suivants peuvent être saisie en format libre
| ACQ | BEGSR | CALLP | CHAIN | CLEAR | CLOSE |
| COMMIT | DEALLOC | DELETE | DOU | DOW | DSPLY |
| DUMP | ELSE | ELSEIF | ENDxx | ENDSR | EVAL |
| EVALR | EXCEPT | EXFMT | EXSR | FEOD | FOR |
| FORCE | IF | IN | ITER | LEAVE | LEAVESR |
| MONITOR | NEXT | ON-EXIT | ON-ERROR | OPEN | OTHER |
| OUT | POST | READ | READC | READE | READP |
| READPE | REL | RESET | RETURN | ROLBK | SELECT |
| SETGT | SETLL | SORTA | TEST | UNLOCK | UPDATE |
| WHEN | WRITE | XML-INTO |
Codes Opération à facteur 2 étendu ou en format libre V5
| Code |
Exemple |
| ACQ | ACQ(E) device fichier_icf; // lien entre un fichier ICF et une unité |
| BEGSR/ ENDSR |
BEGSR toto; |
| CALLP * | callp QCMDEXC('wrksplf' : 7) // nécessite un prototype |
| CHAIN | CHAIN(N) nocli clientf1 ; |
| CLEAR | Clear *nokey clientf1; // remise à blanc de clientf1 sauf les clés |
| CLOSE | Close clientp1; |
| COMMIT | Commit; // validation de la dernière transaction |
| DATA-GEN | Data-Gen DS1 %data(sortie) %gen(MONPGM); //sortie généré par MONPGM depuis DS1. |
| DATA-INTO | Data-into DS1 %data(JSON) %parser(MONPGM); //JSON traité par MONPGM et placé dans DS1. |
| DEALLOC | dealloc(N) ptr; //libère l'espace mémoire et affecte null à ptr |
| DELETE | delete clientf1; |
| DOU | Dou %EOF; |
| DOW | Dow not *in03 and not *in12; |
| DSPLY | dsply 'voulez-vous continuer ?' 'QSYSOPR' rep; |
| ELSE | if a = B; |
| ELSEIF | if a = B; |
| EXCEPT | Except detail; // sortie (spécif O) hors cycle. |
| EXFMT | Exfmt image; |
| EXSR | Exsr monsouspro; / exécute monsouspro |
| EVAL (evalr) |
eval(H) montant = (qte * prix) * (1 + (tva /100) ); |
| EVAL-CORR |
eval-CORR DS1 = DS2; // toutes les zones de même nom sont copiées. |
| FEOD | FEOD entcdep1 ; // force écriture physique dans entcdep1 |
| FOR | FOR i = 1 to 15 ; |
| FOR-EACH | FOR-EACH wcep IN %list('Syrah' : 'grenache' : 'carignan'); |
| FORCE | FORCE entcdep1 ; // force ce fichier a être lu au prochain cycle |
| IF | if *in30; |
| IN | IN *lock dataarea ; // lecture d'une data aréa (avec verrou) |
| ITER | iter; // (saute un tour de boucle (dans un FOR par exemple) |
| LEAVE | leave; // (sortie anticipée d'une boucle) |
| LEAVESR | leavesr; // (sortie anticipée d'un sous programme) |
| MONITOR | Monitor; // (démarre un groupe d'instructions sous contrôle) |
| NEXT | next ecran nomfichier; // indique l'unité à lire la prochaine fois |
| ON-EXIT | on-exit ; |
| ON-ERROR | Monitor; |
| OPEN | OPEN CLientp1; |
| OUT | OUT dataarea; // à jour d'une data -area |
| POST |
Post ecran01; // met à jour l'INFDS d'écran01 |
| READ/readp |
dow not %eof; |
| READE/ |
READe nocde detdcep1; //lecture du suivant si la clé égale nocde. |
| READC |
READC FE; // lecture séquentielle des lignes modifiés dans FE. |
| REL |
REL UNITE ; // le contraire de ACQ |
| RESET |
RESET datastructure; // réattribut les valeurs initiales. [INZ( ).] |
| RETURN |
return: // sortie anticipée d'un programme |
| ROLBK | rolbk; // annulation de la dernière transaction |
| SELECT |
SELECT ; |
| SETLL/setgt |
SETLL nocli entcdef1; // se positionne sur la première commande |
| SORTA (A | D) |
Sorta tbldestva ;//(tri le tableau, avant V7, doit être déclaré ASCEND/DESCEND) |
| TEST(E |
test(ed) *ISO datechar; // test DATECHAR avant conversion. |
| UNLOCK |
if *in12 ; |
| UPDATE |
else ; |
| WRITE |
write clientf1; // ajout d 'un nouveau client. |
| XML-INTO |
xml-into DS1 %xml(data); // lecture XML et placement dans DS1. |
* CALLP est apparu en V3R60 et permet un appel en format libre :
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)
DCL-PR exec EXTPGM('QCMDEXC')
cde CHAR(50) CONST;
cdl PACKED(15 : 5) CONST;
END-PR;
Utilisation :
exec('WRKSPLF': 7) ;
avec prototype(jusqu'à V6R1) ET interface de procédure ( PI )
DProgrammeB PR EXTPGM('PROGRAMMEB')
D 6 0
DProgrammeB PI
D nocli 6 0
Depuis la V7R10, le prototype n'est plus obligatoire pour le programme en cours
à condition de placer EXTPGM sur l'interface de procédure
DProgrammeB PI EXTPGM('PROGRAMMEB') D nocli 6 0
En free-form RPG
DCL-PI *N DCL-PI programmeB EXTPGM('PROGRAMMEB');
nocli PACKED(6:0) ; ou nocli PACKED(6:0) ;
END-PI; END-PI;
Options pour les codes opération
|
Code
|
Exemple
|
| (H) |
réalisation d'un arrondi lors de l'opération. |
| (N) |
lecture sans verrouillage. |
| (P) |
complémantation à blanc avec MOVE, MOVEL, XLATE, etc... |
| (M) |
pour un calcul, travailler avec une précision maxi (un seul arrondi). |
| (R) |
pour un calcul, travailler avec la même précision que la variable |
| (E) |
Erreur gérée (pour tout les ordres avec indicateur en <<). |
| (D) |
pour CALLB, transmission du descripteur de paramètres [ILE]. |
| (D | T | Z) | pour TEST (date, heure, horodatage). |
| (A | D) | pour SORTA (V7R1), indique dynamiquement le critère de tri. |
Fonctions intégrées
voyez
aussi le classement par version
| Fonction(x) |
Retourne |
Exemple |
| %ABS | valeur absolue | |
| %ADDR | l'adresse d'une variable | EVAL ptr= %addr(data) |
| %ALLOC | l'adresse d'un nouvel espace mémoire | EVAL prt= %alloc(nboctets) |
| %BITNOT | inverse les bits | %BITNOT(x'00') = x'FF' |
| %BITOR | applique un OU logique bit à bit | %BITOR(x'F0' : x'0F') = x'FF' |
| %BITAND | applique un ET logique bit à bit | %BITAND(x'F1' : x'1F') = x'11' |
| %BITXOR | applique un OU exclusif bit à bit | %BITXOR(x'F1' : x'1F') = x'EE' [1110 1110) |
| %CHAR | transforme date ou numérique en chaîne | ZoneChar=%CHAR(ZoneDec) // 000123,45- ==> '-123,45' |
| %CHECK | la position du premier caractère invalide | Eval pos = %check('0123456789.' : variable) |
| %CHECKR | Idem %CHECK, mais en commencant à droite. | |
| %DATE | convertit une variable (alpha ou dec) en date ou retourne la date du jour. | eval datcmd = %DATE(datchar : *YMD0)//(c'est un zéro) |
| %DAYS | indique un nombre de jours | eval datliv = datcmd + %DAYS(15) |
| %DECPOS | donne le nombre de décimales | |
| %DEC %DECH |
transforme une valeur numérique
(char en V5.2,date en V5.3) en numérique condensé ou
packé. |
eval DATAMJ = %dec(DATCDE : *YMD) |
| %DIFF | exprime un écart entre deux dates ou heures | eval ecart = %DIFF(datliv : datcmd : *DAYS) |
| %DIV |
résultat de la division (entiers uniquement) | |
| %EDITC |
transforme du numérique en chaine avec application
d'un edit code |
eval msg = 'date de traitement' + |
| %EDITW |
idem %EDITC mais avec un mot d'édition | |
| %ELEM | donne le nombre d'occurences d'un tableau ou d'une DS | if I < %elem(tbl_tva) |
| %EOF |
indique si l'on est fin de fichier | dow not %eof(clients) |
| %ERROR |
indique si on est en erreur (à utiliser suite à un code avec (E).) |
if %error |
| %EQUAL |
indique un positionnement par égalité (SETLL) une recherche aboutie par égalité (LOOKUP) |
|
| %EDITFLT |
transforme de virgule flottante vers chaîne | |
| %FIELDS | Mise à jour d'une liste finie de zones lors d'un UPDATE . | Update clientf1 %FIELDS(nomcli : depcli : ville) ; |
| %FLOAT |
transforme une valeur numérique (ou caractère) au format virgule flottante | |
| %FOUND |
indique un positionnement réalisé(SETLL,SETGT) un recherche aboutie (CHAIN) |
|
| %GRAPH |
conversion en DBCS | |
| %HOURS | exprime un nombre d'heures | eval demain = maintenant + %hours(18) |
| %INT %INTH |
transforme une valeur numérique
(ou caractère en 5.20)au format binaire signé |
|
| %KDS | Utilisation d'une DS en tant que liste de clés sur un CHAIN. | CHAIN %KDS(dscli) clientf1; |
| %LEN |
retourne la longueur d'une expression | if %len(%trim(nom)) > 2 eval L = %len(zone-variable) |
%LIST |
considère une série de valeurs comme un tableau | tbcepage = %list('Syranh' : 'grenache' : 'carignan')
IF wcep in %list('Syrah' : 'grenache' : 'carignan') |
| %LOOKUP |
indique si un élément est présent dans un tableau | eval pos = %lookup('$' : monnaies) |
%MAX |
Retourne la plus grande valeur (7.3,TR2) | maxi = %max(priha: prirv: privente); |
%MIN |
Retourne la plus petite valeur (7.3,TR2) | datecheance = %min(datliv : datfac) + %days(60); |
| %MINUTES | exprime un nombre de minutes | voir %HOURS() |
| %MONTHS | exprime un nombre de mois | voir %DAYS() |
| %MSECONDS | exprime un nombre de microsecondes |
voir %HOURS |
| %NULLIND |
test la val.nulle sur un champ base de données | IF %NULLIND(datcmd) = *ON |
| %OCCUR | positionne sur une occurrence de DS |
%OCCUR(DS1) = 7 ou x = %occur(DS2) |
| %OPEN |
indique si un fichier est ouvert | if %open(clients) |
| %PADDR | l'adresse d'une procédure (pour CALLB) | |
| %PARMS | indique le nombre de paramètres recus | if %parms > 2 |
| %PARMNUM | retourne la position d'un paramètre | if %parms > %parmnum(nocli) // nocli transmis ? |
%PROC |
Retourne le pgm ou la procédure en cours (TR3) | monpgm = %proc(); |
%RANGE |
avec IN , pour tester une plage de valeurs | if car in %range('a' : 'z') |
| %REALLOC | Réalloue un espace mémoire plus grand |
voir %ALLOC |
| %REM |
reste de la division (entiers uniquement) | if %rem(an : 4 )= 0 |
| %REPLACE | remplace par une chaîne l'information située à la position indiquée | [var1 = 'AS/400'] |
| %SECONDS |
exprime un nombre de secondes | voir %HOURS() |
| %SHTDN |
indique si le système est en phase d'arrêt | if %SHTDN |
| %SCAN |
recherche si présence d'une chaîne de caractères | eval chaine = 'ILE/RPG-IV' |
%SCANR |
recherche (de droite à gauche) si présence d'une chaîne |
|
| %SCANRPL | recherche et remplace une chaîne | eval resultat = %SCANRPL('GAP' : 'RPG' : origine) |
| %SIZE | donne la longueur déclaré d'une variable | if %SUBST(nom : %size(nom): 1) = *blank |
| %STATUS |
indique le n° d'erreur (code status) | if %error and %status(clients) = 1252 |
| %STR | transforme une chaine RPG en chaîne compatible C (pointeur vers une chaine terminée par x'00' ) |
|
| %SUBDT | extrait une partie d'une date | eval annee = %SUBDT(datliv : *YEARS) |
| %SUBST | extraction d'une chaine de caractère | if %subst(raisoc : 1 : 1) <> ' ' |
| %SUBARR | une partie d'un tableau | resultat = %xfoot( %subarr(tbl : i : 5) )// 5 postes |
| %TIME |
convertit une variable (alpha ou dec) en heure ou retourne l'heure en cours. | if %time(pointage : *HMS) = T'23:59:59' |
| %TLOOKUP[xx] |
indique si un élément est présent dans une table GAP | voir %lookup |
| %TRIM | élimination des espaces d'extrémité | eval NP = %trim(nom) + ' ' + %trim(prenom) |
| %TRIML|%TRIMR | élimination des blancs de gauche/de droite | |
| %UCS2 |
conversion en UNICODE | |
| %UNS %UNSH |
transforme une valeur numérique (ou caractère
) au format binaire non signé |
|
| %XFOOT |
somme d'un tableau | eval total = %xfoot(tb_salaire) + prime |
| %XLATE | transforme une variable apha | eval resultat = %XLATE('abcdef' : 'ABCDEF' : origine) |
| %XML | coordonnées des données XML à lire (cf XML-INTO) | xml-into DS1 %xml(data : 'doc=string') |
| %YEARS | exprime un nombre d'années | voir %DAYS |
Codes Opération Historiques (ne passent pas le format libre)
voyez aussi le classement par genre
Code |
Facteur 1 |
Facteur 2 |
Zone résultat |
>> |
<< |
== |
| ACQ (ACQUIRE pour unité ICF) |
nom-unité | Fichier Workstn | ER | |||
| ADD (ajout) | (origine) | val. ajoutée | Résultat | + | - | 0 |
| ANDxx | élément comparé | val. de comparaison | ||||
| BEGSR (début sous pgm) | nom-spgm | |||||
| CABxx (Comp and Branch) | élément comparé | val. de comparaison | label | |||
| CALL | pgm externe | |||||
| CALLB | procédure liée | |||||
| CASxx (Comp and SR) | élément comparé | val. de comparaison | sous-pgm | |||
| CAT (concaténation) | élément1 | élément2 [:nb esp] |
Résultat | |||
| CHECK (vérification -->) | car.autorisés | chaine à vérifier | position en erreur | ER | FD | |
| CHECKR (vérification <--) | car.autorisés | chaine à vérifier | position en erreur | ER | FD | |
| CLEAR (mise à blanc structure) | (*NOKEY) | zone/DS/format | ||||
| CLOSE | fichier | |||||
| COMMIT (validation) | (frontière | |||||
| COMP | élément comparé | val. de comparaison | > | < | = | |
| DEFINE (définition zone) | *LIKE | zone modèle | nouvelle zone | |||
| DEFINE (déclaration dtaara) | *DTAARA | nom externe | nom/pgm | |||
| DELETE | (clé) | format | ER | |||
| DIV (division) | (origine) | diviseur | Résultat | + | - | 0 |
| DOUXX (jusqu'à) | élément comparé | val. de comparaison | ||||
| DOWxx (tant que) | élément comparé | val. de comparaison | ||||
| DSPLY | (message) | file d'attente | (réponse) | |||
| ELSE | ||||||
| END, ENDIF, ENDDO,ENDSL,ENDCS |
||||||
| ENDSR (fin sous pgm) | label | |||||
| EXCEPT (spécif O) | nom-spécif O | |||||
| FEOD (force end of data) | fichier | |||||
| GOTO | label | |||||
| IFxx | élément comparé | val. de comparaison | ||||
| ITER (saut d'un tour de boucle) | ||||||
| IN (lecture) | (*LOCK) | data area | ||||
| KLIST (définition de clé) | nom-klist | |||||
| KFLD (zone d'une clé) | zone clé | |||||
| LEAVE (sortie anticipée) | ||||||
| LOOKUP (recherche dans tableau) |
recherche | tableau(,indice) | EQ | |||
| MOVE (cadrage à droite) | origine | Résultat | ||||
| MOVEA (zone dans tableau) | Origine | Résultat | ||||
| MOVEL (cadrage à gauche) | origine | Résultat | ||||
| MULT (multiplication) | (origine) | multiplicateur | Résultat | + | - | 0 |
| MVR (obtention du reste) | Résultat | + | - | 0 | ||
| OCCUR (DS à occurences) | (autre DS) | DS | (position) | |||
| OPEN | fichier | |||||
| ORXX | élément comparé | val. de comparaison | ||||
| OTHER (autre cas p. SELECT) | ||||||
| OUT (mise à jour) | (*LOCK) | data area | ||||
| PARM (définition paramètre) | val au retour | val à l'envoi | Paramètre | |||
| PLIST (liste de paramètre) | (*ENTRY) | |||||
| READ (accès séquentiel) | format (fichier) | ER | EOF | |||
| READC (lecture s/fichier) | format | ER | EOF | |||
| READE (séquentiel avec test) | clé | format (fichier) | ER | EOF | ||
| READP (séquentiel arrière) | format (fichier) | ER | BOF | |||
| READPE (arrière avec test) | clé | format (fichier) | ER | BOF | ||
| REL (RELEASE pour unité ICF) |
nom-unité | Fichier Workstn | ER | |||
| RESET (mise à état initial) | zone/DS/format | |||||
| RETURN (fin immédiate/pgm) | ||||||
| ROLBK (invalidation) | ||||||
| SCAN (recherche) | recherche[ : lg] | chaine[: début] | Position | FD | ||
| SELECT (test multiples) | ||||||
| SETLL (positionnement > ou =) | clé | format (fichier) | NR | ER | EQ | |
| SETGT(positionnement > ) | clé | format (fichier) | NR | ER | ||
| SETON | -- |
-- |
-- |
|||
| SETOFF | -- |
-- |
-- |
|||
| SUB (soustraction) | (origine) | val. soustraite | Résultat | + | - | 0 |
| TAG (définition d'un label) | label | |||||
| TESTN (test si numérique) | Chaine | num | (sp) | |||
| UNLOCK (libération) | fichierou DA | |||||
| UPDATE | format | ER | ||||
| WHENXX | élément comparé | val. de comparaison | ||||
| WRITE | format | ER | ||||
| XFOOT (somme d'un tableau) | tableau | Résultat | ||||
| XLATE (transformation) | DE : A | origine[ : début] | Résultat | |||
| Z-ADD (zéro puis ajout) | valeur | Résultat | ||||
| Z-SUB (changement signe) | valeur | Résultat |
ER =Erreur FD =Found NF =not found B = blanc |
Cas particulier des dates en V4
Toutes les calculs de date se font avec des durées, exprimées
comme suit : valeur : *X
(*X indiquant un qualificatif de durée)
| *D | nombre de jours |
| *M | nombre de mois |
| *Y | nombre d'années |
| *H | nombre d'heures |
| *MN | nombre de minutes |
| *S | nombre de secondes |
| *MS | nombre de mico-secondes |
Code Opération |
Facteur 1 |
Facteur 2 |
Zone résultat |
>> |
<< |
= = |
| ADDDUR | date | durée | date | |||
| SUBDUR | date | durée | date | |||
| date | date | durée | ||||
| EXTRCT | date | jour | mois | année : durée | ||||
| TIME | date/heure/timestamp | |||||
| TEST(D | T | Z) | chaine | ER |
Proposition de remplacement des
codes invalides en format libre
| Code Opération |
Remplacement |
Exemple |
| ADD | + | EVAL A = A +1 ou A = A+1 ou A+=1 |
| ADDDUR | + | Datliv = datcmd + %DAYS(45) |
| ALLOC | %alloc | |
| ANDxx | (test en libre) | if A=B AND compteur<>0 |
| CABxx | (à éviter) | |
| CALL | CALLP + EXTPGM | CALLP pgmA (parm1 : parm2) // ou -> pgmA(parm1 : parm2); |
| CALLB | CALLP + EXTPROC | idem |
| CASxx | IF + EXSR | |
| CAT | + | Message = 'date de traitement' + DATCHAR |
| CHECK | %check | pos = %check('0123456789-+,' : qtechar) |
| CHECKR | %checkr | idem |
| *LIKE DEFINE | déclaration en D avec LIKE( ) | |
| *DTAARA DEFINE | déclaration en D avec DTAARA( ) | |
| DIV | / | |
| DO | FOR | FOR i = 1 to 50 |
| DOUxx | DOU | Dou %eof |
| DOWxx | DOW | Dow not %eof |
| END | ENDxx (déja recommandé avant) | |
| ENDCS | cf CAS | |
| EXTRCT | %subdt | mois = %SUBDT(DATCMD : *M) |
| GOTO | c'est quoi ? ;-) | GOTO DEBUT -> ITER GOTO FIN -> LEAVE |
| IFxx | IF | if GAP = 4 |
| KFLD | %KDS ou directement (K1 :K2) | CHAIN (societe: nocli) clientf1 |
| KLIST | (cf ci-dessus) | |
| LOOKUP | %lookup | tva = %lookup(code : tbtva) |
| MOVE | EVALR , Convertir avec les fonctions intégrées | datcmd = %DATE(datchar:*ISO) ou chaine = %char(datcmd) |
| MOVEL | EVAL, idem pour les conversions | |
| MOVEA | Définition d'une zone CHAR en recouvrement puis %SUBST |
DCL-S IND99_p POINTER INZ(%addr(*in)); DCL-S ind99 CHAR(99) BASED(IND99_p); MOVEA '010' *in(80) -> %SUBST(IND99 : 80 : 3) = '010'; |
| MULT | * | |
| MVR | %rem | if %rem(AN : 4) = 0 |
| OCCUR | %occur | |
| ORxx | cf ANDxx | |
| PARM | Prototype en spécif D * | |
| PLIST | cf PARM | |
| REALLAOC | %realloac | |
| SCAN | %scan | QUATRE = %scan('4' : 'RPG4') |
| SETOFF | *inxx = *off | |
| SETON | *inxx = *on | |
| SUB | - | |
| SUBDUR | - | HIER = AUJOURDHUI - %days(1) |
| ou SUBDUR | %diff | UN = %DIFF(aujourdhui : hier:*Days) |
| SUBST | %subst | |
| TAG | cf GOTO | |
| TESTN | %check | if %check('0123456789' : QTECHAR) > 0 |
| TIME | %date() ou %time() | aujourdhui = %date() |
| WHENxx | WHEN | |
| XFOOT | %xfoot | TVA = %xfoot(tbmt) * TAUX |
| XLATE | %xlate | GRAND = %xlate(minuscles: majuscules: PETIT) |
| Z-ADD | EVAL | |
| Z-SUB | EVAL - |
(C) Volubis 2001-2017