La spécif C en ILE/RPG-IV RPG ! RPG-IV ! signification ! commentaires ------!---------!--------------------!----------------------------------- ! ! ! 6 ! 6 ! C ! ! ! ! 7-8 ! 7-8 ! Niveau de contrôle ! Lx ! ! ou ! ! ! Continuation ! AN/OR ! ! ! 9-17 ! 9-11 ! Conditions ! Nxx (un seul indicateur !) ! ! ! ! ! ! Mais il est possible d'utiliser ! ! ! des lignes de continuation : ! ! ! ! ! ! N24 30 Z-ADD 0 RESULT ! ! ! devient ! ! ! N24 ! ! !AN 30 Z-ADD 0 RESULT ! ! ! |
18-27 ! 12-25 ! Facteur 1 ! les noms sont à 10, les tableaux ! ! ! indicés à 14 nomtableau(in) ! ! ! 28-32 ! 26-35 ! Code opération(O) ! Options possibles : ! ! ! (H) arrondi ! ! ! (N) Read with no lock ! ! ! (P) complémenté (padded) à blanc ! ! ! (D) manipulation d'une date ! ! ! (T) " d'une heure ! ! ! (Z) " d'un horodatage. ! ! ! (M|R) en V3R70 : idem EXPROPTS ! ! ! (E) en V4R20 : gestion des erreurs ! ! ! 33-42 ! 36-49 ! Facteur 2 ! Toujours 14 positions. ! ! ! 43-48 ! 50-63 ! zone résultat ! " " " . ! ! ! 49-51 ! 64-68 ! longueur ! Définition de la zone résultat 52 ! 69-70 ! nbr de décimales ! 53 -----------------------------> ! H,N,P : maintenant (O) 54-59 ! 71-76 ! indics résultants ! >><<== ------!---------!--------------------!-------------------------------------- |
les codes opération : IF, DOU, DOW, WHEN et EVAL utilisent une spécif C à facteur 2 étendu (invite SEU IPCX) ! RPG-IV ! signification ! commentaires !---------!--------------------!----------------------------------- ! 6 ! C ! ! ! ! ! 7-8 ! Niveau de contrôle ! Lx ! ! ! ! 9-11 ! Condition ! Nxx ! ! ! ! 26-35 ! Code opération(O) ! Options : EVAL(H | M |R), CALLP(E) ! ! ! ! 36-80 ! Facteur 2 étendu ! expression en format libre !---------!--------------------!----------------------------------- Une expression peut occuper plusieurs lignes (sans marque de continuation) le format des lignes de continuation sera: ! RPG-IV ! signification ! commentaires !---------!--------------------!----------------------------------- ! 6 ! C ! ! 36-80 ! Facteur 2 étendu ! suite de l'expression. !---------!--------------------!----------------------------------- |
syntaxe générale du code opération EVAL il s'agit d'un ordre d'affectation (idem à CHGVAR en CL) eval resultat = expression syntaxe des codes de test (IF, DOU, DOW, et WHEN) if a > B dou a = 0 or x <> Y etc ... à noter la forme suivante eval *in40 = (qte > 0) qui demande à ce que *in40 recoive le résultat du test QTE > 0 (40 = *on si qte plus grand que zéro) |
Expressions : -> toute fonction valide (voir plus loin) -> chaînes de caractères: + = concatenation entre deux chaînes -> variables numériques + , - , * , / = addition , soustraction, multiplication , division ** = élévation à la puissance -> tests logiques = , >= , > , <= , < , <> (EQ, GE, GT, LE, LT, NE) AND , OR , NOT, (, ) (et, ou, non) un indicateur représente déja un test logique C dow not *in03 C if *in12 and *in50 |
Les expressions occupants plusieurs lignes suivent les règles suivantes: Un caractère de continuation n'est obligatoire que lorsqu'une CONSTANTE est scindée sur deux lignes : (un "+" dans une phrase est ignoré) C eval msg = 'ceci est une constante vraiment très + C longue avec en + un caractère spécial' Une fonction peut occuper plusieurs lignes C eval taille = %size( C var1 C ) Il est conseillé de ne pas scinder au milieu d'un mot. ces deux lignes ne sont pas comprises : C eval result = %subst(%trim(message):1:%size(variab C le)) ces deux lignes le sont, (et sont plus lisibles) : C eval result = %subst(%trim(message) : 1 : C %size(variable) ) |
Quelques exemples : C if (codetarif = '1' or codetarif = '2') C and *in90 C ... C endif * tests multiples C select C when codfacture='CH' C ... C ... C when codfacture = 'ES'and devise = 'EUR' C ... C DOU ecart = 0 C .. C .. C ENDDO C C endsl |
Fonctions reconnues : fonction ! argument ! type retour ! signification -----------!---------------!---------------!------------------------------ %ADDR ! variable ! pointeur ! adresse de la variable ! ! ! %PADDR ! procédure ! proc-pointeur ! utilisable par CALLB ! ! ! %ELEM ! Tableau ! numérique ! nombre de postes !DS à occurences! ! nombre d'occurences ! ! ! %SIZE ! variable ! numérique ! taille de la variable ! tableau ! ! taille d'un poste ! tableau:*ALL ! ! taille du tableau ! ! ! %SUBST ! (var:deb:lg) ! chaîne ! extrait une chaîne ! .......................................................... ! : if %subst(raisoc : 1 : 1) <> ' ' |1er car. : ! : | : ! : if %subst(raisoc : %size(raisoc) : 1) <> ' '|dernier : ! : | : ! : eval %subst(pgm : 1 : 1) = 'Q' | : ! :.......................................................>: |
fonction ! argument ! type retour ! signification -----------!---------------!---------------!------------------------------ %TRIM ! chaîne ! chaîne ! supprime les blancs extrèmes ! ! %TRIML ! chaîne ! chaîne ! supprime les blancs de gauche ! ! %TRIMR ! chaîne ! chaîne ! supprime les blancs de droite ! ! ! %PARMS ! (aucun) ! numérique ! nombre de paramètres recus. ! ! ! ! ............................. ! : if %parms > 2 : ! : eval wp3 = p3 : ! :...........................: ! ! ! Fonctions V3R70 : %ABS ! variable ! numérique ! valeur absolue ! ! ! %DEC ! num : precis.! packé ! précision indiquée en %DECH ! ! ! argument (%DECH = arrondi) ! ! ! %DECPOS ! numérique ! numérique ! nombre de décimales |
fonction ! argument ! type retour ! signification -----------!---------------!---------------!------------------------------ ! ! ! %EDITC ! num : editcod! chaîne ! retourne le chiffre édité ! ........................................................ ! : exemple : eval msg = 'date de traitement' + : ! : %editc(date : 'Y') : ! : : ! : eval montanchar = %editc( : ! : qte * prix : '3'): ! :......................................................: ! ! ! %EDITFLT ! scientifique ! chaîne ! retourne le chiffre édité ! ! ! %EDITW ! num : editword! chaîne ! retourne le chiffre édité ! ! ! ! ! ! (mais avec un mot d'édition) ! ! ! %FLOAT ! numérique ! scientifique ! conversion ! ! ! %INT ! numérique ! binaire ! conversion %INTH ! ! signé ! (%INTH = arrondi) |
! ! ! %UNS ! numérique ! binaire ! conversion %UNSH ! ! non signé ! (%UNSH = arrondi) ! ! ! %LEN ! expression ! numérique ! longueur ! ! ! %STR ! pointeur ! chaîne ! gestion des chaînes à ! ! ! terminaison 0 (langage C) ! ! ! %SCAN !ch1:ch2 [:dep] ! numérique ! recherche si ch1 est dans ch2 ! ! ! à partir de 'dep' ! ! ! ! ! ! si oui l'information retournée ! ! ! est la position. ! ! ! ................................................................ : exemple : eval chaine = 'ILE/RPG-IV' : : eval pos = %scan('I' : chaine) [pos=1] : : eval deb = pos + 1 : : eval pos = %scan('I' : chaine: deb) [pos=9] : :..............................................................: |
fonction ! argument ! type retour ! signification -----------!---------------!---------------!------------------------------ %NULLIND ! variable ! indicateur ! test ou assignation de la ! ! (*ON ou *OFF) ! valeur nulle. en effet RPG-IV supporte les variables à valeur nulle (ALWNULL en SDD) [il faut compiler avec ALWNULL(*USRCTL).] les tests se font sous la forme IF %NULLIND(datcmd) = *ON l'affectation : EVAL %NULLIND(PRIME) = *ON ou bien EVAL %NULLIND(prime) = *OFF puis EVAL prime = 1500 |
pour l'accès direct avec val. nulle, précisez un indicateur sur les clés : C cle01 Klist C kfld zone1 C kfld *in40 zone2 C kfld *in41 zone3 c EVAL zone1 = 'ABC' c EVAL zone3 = 'X' C EVAL *in40 = *ON C EVAL *IN41 = *OFF C cle01 CHAIN fichier on cherche un enregistrement avec zone1 = ABC, zone2 nulle, zone3 = X C EVAL *IN41 = *ON C cle01 CHAIN fichier on cherche un enregistrement avec zone1 = ABC, zone2 et zone3 nulles. (le contenu de zone3 est ignoré) |