RPG-IV en V5R20 : ° transformation directe de chaines en numérique (%DEC, %INT , etc...) ° Nombreuses améliorations sur les DS : - DIM admis - DS dans une DS, ... - DS par copie d'un format, plus souple. ° nouvelles fonctions de manipulation de bits ° une clé complexe peut être indiquée sur le CHAIN (sans KLIST) ° une liste des zones à mettre à jour peut être indiquée sur UPDATE ° nouveaux opérateurs += , -= , *= , /= (expressions en format libre) |
Data Structures : - rappels V5R10 QUALIFIED, permet de manipuler une DS par nomDS.nomdezone LIKEDS , permet de créer une DS identique à une autre (QUALIFIED implicite) - le mot clé DIM est admis sur les DS (QUALIFIED obligatoire) D test DS DIM(20) QUALIFIED D zone1 4 D zone2 3 0 puis manipulation par /free x += 1 ; // <- nouveauté V5R20, voir plus loin. test(x).zone1 = 'toto'; /end-free |
- le mot clé LIKEDS est admis sur une sous-zone > Dim est admis, pour des tableaux à n dimensions > ALTSEQ est "hérité" de la DS d'origine > OCCURS et INZ ne le sont PAS ==> utiliser INZ(*likeds) D test1 DS D zone1 4 D zone2 3 0 D test2 DS QUALIFIED D zonea 4 D zoneb 3 0 D zonec LIKEDS(test1) puis manipulation par /free test1.zone1 = 'toto'; test2.zonec.zone1 = 'truc'; /end-free |
pour déclarer une DS "modèle", uniquement pour utilisation avec LIKEDS : D wptr S * D test1 DS based(wptr) ... /free test2.zonec.zone1 = 'truc'; // ATTENTION : test1.zone1 = 'toto' ==> PLANTE le pgm ! /end-free exemple : Dptr S * Dds_dep DS based(ptr) D depnom 25 D ca 13 2 Dregions DS qualified dim(50) D numero 3 0 D nom 25 D depart likeds(ds_dep) dim(9) |
D I s 10I 0 D J s 10I 0 /free for i = 1 to %elem(regions) ; for j = 1 to %elem(regions.depart) ; regions(i).depart(j).ca = i*j; endfor; endfor; *inlr = *on; /end-free ...................... en debug ............................. : EVAL regions : : REGIONS.NUMERO(1) = . : : REGIONS.NOM(1) = ' ' : : REGIONS.DEPART.DEPNOM(1,1) = ' ' : : REGIONS.DEPART.CA(1,1) = 00000000001.00 : : REGIONS.DEPART.DEPNOM(1,2) = ' ' : : REGIONS.DEPART.CA(1,2) = 00000000002.00 : : REGIONS.DEPART.DEPNOM(1,3) = ' ' : : REGIONS.DEPART.CA(1,3) = 00000000003.00 : :............................................................: |
- le mot clé LIKEREC permet une définition de DS par copie d'un format (déclaré en specif F), et avec choix des zones à copier. LIKEREC(nom-format : *ALL | *OUTPUT | *INPUT | *KEY) *ALL copie de toutes les zones. *INPUT les zones en entrée (comme les DS externes) *OUTPUT les zones en sorties *KEY uniquement les zones clés. cette dernière option permet : CHAIN %KDS(nom-ds) fichier - modification des ordres de lecture (CHAIN, READ, etc...) - les ordres de lecture admettent un nom de DS en dernier argument (format libre uniquement), permettant de placer la lecture automatiquement dans une DS (avant c'était possible, mais en interne) READ format nom-de-ds ; |
- CHAIN, READE, SETLL, SETGT, DELETE admettent une définition de clé complexe, comme suit : CHAIN Klist fichier; CHAIN (zone1 : zone2 : zone4) fichier ; CHAIN %KDS(nom-de-DS) ; // (créé par LIKEREC(*KEY) ou non) - UPDATE admet une liste des zones à modifier (pour modif partielle) avec la fonction %FIELDS() UPDATE format %FIELDS(zone1 : zone2 : zone4) ; |
- transformation numérique, les fonctions : %DEC , %DECh , %INT, %INTh, %UNS , %UNSh , %FLOAT admettent un argument de type chaine et le transforment en numérique. les signes + et - sont admis à gauche ou à droite. la marque décimale peut être , ou . les espaces sont ignorés. /free R = %dec('+ 3,25') + 1; // retourne 4,25 /end-free - fonctions de manipulation de bits (manipulation d'attributs d'affichage ou fonctions réseau) : %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 ET exclusif, bit à bit %BITXOR(x'F1' : x'1F') = x'EE' : 1111 0001 0001 1111 ---------- 1110 1110 - DTAARA(*VAR : ), le nom de la data-area peut être une variable. DATAARA(MADA) : on utilise MADA dans *LIBL DATAARA(*VAR:MADA) : on utilise le contenu de la variable RPG "MADA" - les zones numériques acceptent un maximum de 31 chiffres (avant c'était 30), RPG devenant pleinement compatible avec DB2/400. |
- on admet de nouveaux opérateurs, dans les expressions : += : x += 1 identique à x = x + 1 -= : x -= 1 x = x - 1 *= : x *= 2 x = x * 2 /= : x /= 2 x = x / 2 uniquement valide dans les expressions en format libre. |