La spécif D ILE/RPG-IV

BoTTom |    Changer de couleur
 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)


|    Changer de couleur
 
 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.
 


|    Changer de couleur
 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)


|    Changer de couleur
 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)


|    Changer de couleur
 
   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;


|    Changer de couleur
    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);


|    Changer de couleur
 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)


|    Changer de couleur
 
        + 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 !
 


|    Changer de couleur
 
        + 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 :


|    Changer de couleur
 
        - 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.
 


|    Changer de couleur
 
(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
 
 
 


|    Changer de couleur
 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)


|    Changer de couleur
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)


|    Changer de couleur
 
 
 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.
 


|    Changer de couleur
 
 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.
 
 


|    Changer de couleur
 
        + 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.


|    Changer de couleur
 
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)
 


|    Changer de couleur
 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


|    Changer de couleur
 
 - 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


|    Changer de couleur
 
 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


|    Changer de couleur
 
 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;


|    Changer de couleur
 
 ......................  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.





©AF400