Déclaration de variables en RPG-IV (spécif D) Détail : 7 à 21 : nom de zone, de tableau, de DS (indentation possible) le nom peut dépasser la colonne 21 auquel cas il doit être terminé par "..." et suivi d'une spécif D aux colonnes 7 à 21 a blanc, continuant la déclaration. 22 : E = DS externe 23 : type de DS S = système U = associée à une data area 24-25 : type de définition 'DS' = data structure ' ' = sous-zone de data structure 'S ' = variable élémentaire (ou tableau) 'C ' = constante 'PR' = Prototype (pgm ou routine, avec ces paramètres) |
26-32 : position de début (facultative) pour une SDS : *STATUS,*PROC,*PARM,*ROUTINE pour une INFDS : *STATUS,*ROUTINE,*FILE,*RECORD,*OPCODE 33-39 : position de fin ou longueur avec le mot-clé LIKE (définiton par référence à une variable) - peut-être à blanc : définition identique - peut être notée -nnnnn/+nnnnn (définition relative) V6R10 -> la taille maxi des constantes passe à 16380 (la moitié pour UNICODE) -> la taille maxi des variables caractères passe de 65535c. à 16 Mo ! le mot-clé LEN doit être utilisé à la place des colonnes 33-39 pour la définition des variables de grande taille. |
40 : Type : A = caractère G = graphique (Codification DBCS) T = heure Z = horodatage D = date P = packé B = binaire sur 4 chiffres (maxi = 9999) I = Integer : binaire sur 5 chiffres (maxi = 32767) ou 10. U = Unsigned : idem Integer, mais non signé (maxi = 65535) ...................................................................... : (V4R40) I et U sont acceptés de lg 3 (1 octet) et 20 (8 octets): :....................................................................: S = numérique étendu * = pointeur (d'adresse ou de procédure) (V3R70) F = notation scientifique (virgule flottante) (V4R20) N = variable de type indicateur (booléenne) (V4R40) C = variable en UNICODE 41-42 : nbr de décimales [43 : réservé] 44-80 : mots-clés (occupants une à plusieurs lignes) |
exemples : DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords++++++++++++++++++++ DINFOCLI DS D nomcli 1 20 D adrcli 21 40 D vilcli 41 55 D cdpst 56 60 0 ou DINFOCLI DS D nomcli 20 D adrcli 20 D vilcli 15 D cdpst 5 0 DINFOCLI DS D nomcli 20 D adrcli 20 D vilcli 15 D cdpst 5 0 D departementclient... D 2 0OVERLAY(cdpst) D bdist 3 0OVERLAY(cdpst:3) |
en format libre (7.2) dcl-c nom_constante 'constante'; dcl-S nom-variable type(lg); dcl-ds nom-ds; liste des zones; end-ds; DCL-DS INFOCLI; nomcli char(20); adrcli char(20); vilcli char(20); cdpst zoned(5:0); departementclient zoned(2:0) overlay(cdpst); bdist zoned(3:0) overlay(cdpst:*NEXT) END-DS; |
type reconnus équivalent à paramètres -------------- ------------- -------------------------- BINDEC B BINDEC(lg:0) CHAR A (dft) CHAR(lg) DATE D DATE(format[:séparateur]) FLOAT F FLOAT(lg) GRAPH G GRAPH(lg) IND N INT I INT(lg) PACKED P (dft) PACKED(lg:décimales) POINTER * TIME T TIME(format[:séparateur]) UCS2 C UCS2(lg) UNS U UNS(lg) VARCHAR A + varying VARCHAR(lg) VARGRAPH G + varying VARGRAPH(lg) VARUSC2 C + varying VARUCS2(lg) ZONED S ZONED(lg:décimales) exemples: DCL-S compteur INT(5); DCL-S flag IND; DCL-S message CHAR(30); |
Mots-clés zones : + OVERLAY(nom:pos): recouvrement d'une zone (DS admise en V4R2) alternative à l'écriture avec position de début (V4R40) + OVERLAY(nom-de-zone:*NEXT) permet de découper une variable d'une DS SANS figer les positions relatives à cette dernière exemple : D codepost 5 0 D dept 2 0 OVERLAY(codepost) D bdist 3 0 OVERLAY(codepost:*NEXT) dept redéfini codepost (sous entendu à partir de 1) bdist redéfini codepost (sous entendu à la suite de dept, soit 3) + LIKE(nom) : définition d'une variable par rapport à une autre (lg peut être notée sous la forme + xxx) |
+ CONST('constante') ou sous la forme 'constante' la constante peut occuper plusieurs lignes, utiliser alors la marque de continuation '+', toujours obligatoire en RPG-IV quand la coupure à lieu entre deux quotes(') . + IMPORT : variable globale entre procédures elle est "possédée" par un autre pgm(cf EXPORT) + EXPORT : variable globale entre procédures (elle est "possédée" par ce pgm) un seul module peut déclarer une variable EXPORT pour pouvoir utiliser la variable il faut que le module la déclarant EXPORT soit actif ! |
+ INZ(valeur) : valeur initiale Ce mot-clé peut-être utilisé au niveau zone, sous-zone ou DS. Utilisé au niveau d'une DS, toutes les sous-zones sont initalisées suivant leur type (sinon, RPG initialise au niveau le plus haut, c'est à dire la DS qui est TOUJOURS APLHA) Toutes les fonctions intégrées peuvent être utilisées. - %size(), %addr(), ... Pour une DATE : *SYS représente la date système, *JOB la date du JOB Pour une Heure: *SYS représente l'horloge système INZ peut être utilisé sans argument, il s'agit alors de la valeur par défaut du type : |
- alpha = blanc - numérique = 0 - date = 01/01/40 ou 01/01/0001 - heure = 00:00:00 - horodatage = 0001-01-01-00.00.00.0000 (V4R40) + INZ(*EXTDFT) la valeur initiale pour cette zone est la valeur par défaut définie dans la base de données. + INZ(*USER) la valeur initiale pour cette zone est le profil utilisateur en cours. |
(V4R20) + VARYING : variable à longueur variable équivalent du mot-clé VARLEN en SDD, type VARCHAR() en SQL. la longueur réelle peut être retrouvée par : L = %len(nom) affectée par : %len(nom) = 20 sinon l'affectation normale comme : nom = 'constante' ajuste la longueur si besoin. en format libre, il existe des types spécfiques pour les variables à taille variable. le mot-clé VARYING est invalide |
Mots-clés Tableaux : + DIM(x) : définition d'un tableau (x = nb d'éléments) Un tableau peut être trié par SORTA, si vous indiquez un critère de tri : + ASCEND : ordre de tri croissant pour un tableau + DESCEND : ordre de tri décroissant pour un tableau + PERRCD(x) : indique, pour un tableau chargé à la compil ou à la pré-exécution le nombre de postes par enregistrement ou par ligne source. + CTDATA : tableau chargé à la compilation le compilateur cherche des valeurs après **CTDATA (ou ** uniquement) en fin de source + FROMFILE(dbf) : nom du fichier à lire pour un tableau chargé à la pré-exécution.(invalide en free-form) + TOFILE(dbf) : nom du fichier dans lequel écrire le contenu d'un tableau en fin de pgm (invalide en free) |
Exemple d'un tableau des taux de TVA sans valeur initiale (donc à 0). DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords++++++++++++++++++++ DTaux S 4 2 DIM(4) ou dcl-S taux PACKED(4:2) DIM(4) Exemple d'un tableau des taux de TVA renseigné DANS le programme : DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords++++++++++++++++++++ DTaux S 4 2 DIM(4) CTDATA PERRCD(4) C ... C ... ** 0550070019603333 Exemple d'un tableau des taux renseigné à partir d'un fichier DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords++++++++++++++++++++ DTaux S 4 2 DIM(4) FROMFILE(fictauxp1) D PERRCD(1) |
Il n'est pas possible d'indiquer DIM sur la DS avant la V5R20, mais : DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords++++++++++++++++++++ DDS1 DS D TBL1 22 DIM(25) ASCEND D code 2 OVERLAY(TBL1) D lib 20 OVERLAY(TBL1:*next) est admis. RPG-IV considère un tableau de 25 "code" et un tableau de 25 "lib" Ce qui permet ensuite C SORTA code qui tri la totalité de TBL1 ("lib" compris) en fonction du code. |
Mots-clés DS : + EXTNAME(dbf:fmt): nom du fichier(:format) pour une DS externe Une DS externe est un DS dont les sous zones sont automatiquement générées par copie de la structure d'un fichier modèle dbf représente ici le fichier modèle + EXTFLD(nom-ext) : nom externe de la variable pour une DS externe. (il faut alors indiquer le nom interne en 7-21) + PREFIX(xxx) : idem PREFIX en spécif F, pour une DS externe. (V7R10) + ALIAS : idem ALIAS en spécif F, pour une DS externe. |
+ DTAARA(nom) : nom de la data area (identique à *DTAARA DEFINE) Peut être associé à une zone élémentaire, une DS, une sous-zone de DS.Si le nom n'est pas renseigné, on prend le nom de la zone ou de la DS associée. (V5R20) + DTAARA(*VAR : nomv) le nom est contenu dans la zone nomv + OCCURS(x) : DS à occurences multiples (x = nb d'occurences) Une Data structure à occurences multiples est une DS répétée x fois en mémoire. On indice pas une DS à occurence, on se positionne avant par : n° OCCUR nom-ds Une telle DS peut contenir un tableau ce qui permet de simuler un tableau à double entrée avant la V5R20. |
DS évoluées en V5R10, V5R20: le mot-clé QUALIFIED associé à une définition de DS autorise la manipulation des sous-zones sous la forme : nomDS.nomdezone ce qui permet d'avoir un même nom définit dans deux DS différentes. ATTENTION, c'est considéré par RPG COMME DEUX CHAMPS DISTINCTS. Dclient DS QUALIFIED D code 5 D ville 3 client.ville = *blank; cela permet aussi de définir deux fois la même DS avec LIKEDS Dfournisseur LIKEDS(client) |
remarques - les deux DS sont automatiquement qualifiées. - seule la structure de la DS est dupliquée. - les mot-clés OCCUR, INZ, ne le sont pas. mais vous pouvez préciser sur la deuxième DS : INZ(*likeds) - la V6R10 propose TEMPLATE pour définir une DS modèle - En V5R20, le mot clé DIM est admis sur les DS (QUALIFIED obligatoire) D article DS DIM(20) QUALIFIED D code 4 D pointure 2 0 puis manipulation (en format libre uniquement) par : /free x = x + 1; article(x).pointure = '37'; /end-free |
- et 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 dsmodele DS QUALIFIED TEMPLATE D matiere 4 D colori 3 0 D article DS QUALIFIED D codart 4 D pointure 2 0 D modele LIKEDS(DSmodele) puis manipulation par /free article.modele.matiere = 'Cuir'; article.modele.colori = 'Noir'; /end-free |
Vous pouvez ainsi déclarer des tableaux à n dimensions Dds_dep DS TEMPLATE 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 = ???; endfor; endfor; /end-free |
Vous pouvez ainsi déclarer des tableaux à n dimensions (free-form) dcl-ds ds_dep TEMPLATE; depnom char(25); ca packed(13:2); end-ds; dcl-ds regions qualified dim(50); numero packed(3:0); nom char(25); depart likeds(ds_dep) dim(9); end-ds; dcl-s I int(10); dcl-S J int(10); for i = 1 to %elem(regions) ; for j = 1 to %elem(regions.depart) ; regions(i).depart(j).ca = ???; endfor; endfor; |
...................... en debug ............................. : EVAL regions : : REGIONS.NUMERO(1) = 02. : : REGIONS.NOM(1) = 'Pays de Loire ' : : REGIONS.DEPART.DEPNOM(1,1) = 'Loire Atlantique ' : : REGIONS.DEPART.CA(1,1) = 00004578945.00 : : REGIONS.DEPART.DEPNOM(1,2) = 'Anjou ' : : REGIONS.DEPART.CA(1,2) = 00000065782.25 : : REGIONS.DEPART.DEPNOM(1,3) = 'Vendée ' : : REGIONS.DEPART.CA(1,3) = 00000000033.33 : :...........................................................: - le mot clé LIKEREC permet une définition de DS par copie d'un format d'un fichier déclaré, avec choix des zones à copier. LIKEREC(nom-format : *ALL | *INPUT | *OUTPUT | *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. |