Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Tableaux, structures et bits

DEFN

Définir une zone par modèle ou relier une zone de données

Déclare une zone dans la partie traitement, soit sur le modèle d'une autre (*LIKE), soit liée à une zone de données (*NAMVAR).

Syntaxe

     C           *LIKE     DEFN zoneref   nouv
     C           *LIKE     DEFN zoneref   nouv  +nn
     C           *NAMVAR   DEFN zdonn     zone   nn
Facteur 1 (18-27)
*LIKE pour copier la définition d'une zone ; *NAMVAR pour associer une zone à une zone de données. Toute autre valeur est refusée.
Facteur 2 (33-42)
Avec *LIKE, la zone de référence. Avec *NAMVAR, le nom de la zone de données (objet *DTAARA, trouvé par la liste de bibliothèques).
Zone résultat (43-48)
Le nom de la zone définie.
Longueur (49-51)
Avec *LIKE, un ajustement de longueur : +10 allonge, -15 raccourcit, vide pour garder la longueur de référence. Avec *NAMVAR, la longueur de la zone.
Décimales (52)
Avec *LIKE, doit rester vide : les décimales sont celles de la zone de référence.
Effet
Aucun traitement à l'exécution : DEFN sert à la compilation, comme une spécification de définition. La zone créée avec *LIKE a le type, la longueur (ajustée) et les décimales de la zone de référence. La zone définie avec *NAMVAR peut être lue par IN et écrite par OUT.

À quoi ça sert

Avec *LIKE, la nouvelle zone suit les changements de la zone de référence (si NOM passe de 30 à 40 caractères, tous les DEFN *LIKE NOM suivent) : c'est la façon propre de déclarer zones de travail, tampons et cumuls sans répéter les longueurs.

Avec *NAMVAR, on relie une zone de programme à une zone de données (*DTAARA) pour la lire par IN et la mettre à jour par OUT : paramètres d'exploitation, dernier numéro attribué, etc.

Exemple 1 : Zones sur le modèle de NOM et SOLDE

     H*  DEFN *LIKE : definir des zones sur le modele d'une autre
     FCLIENT3 IF  E           K        DISK
     C           *LIKE     DEFN NOM       NOMLON+10
     C           *LIKE     DEFN NOM       NOMCOU-15
     C           *LIKE     DEFN SOLDE     MONT
     C                     Z-ADD400       NUMERO  50
     C           NUMERO    CHAINCLIENT3              99
     C                     MOVELNOM       NOMCOU
     C           NOMCOU    DSPLY
     C                     MOVELNOM       NOMLON
     C           NOMLON    DSPLY
     C                     Z-ADDSOLDE     MONT
     C           MONT      DSPLY
     C                     SETON                     LR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

Bernard Transpo
Bernard Transports
  9800000

NOMCOU est définie sur NOM (30 caractères) avec -15 : 15 caractères, d'où la troncature « Bernard Transpo ». NOMLON (+10) garde « Bernard Transports » en entier. MONT hérite des 9 chiffres et 2 décimales de SOLDE : 98000,00 s'affiche 9800000.

Exemple 2 : Longueurs obtenues

     H*  DEFN *LIKE : longueur d'une zone definie par modele +n / -n
     C                     MOVEL'Bernard' NOMREF 30
     C           *LIKE     DEFN NOMREF    NOMLON+10
     C           *LIKE     DEFN NOMREF    NOMCOU-15
     C           *LIKE     DEFN NOMREF    NOMEGA
     C*  MOVE aligne a droite : l'etoile se place sur le dernier caractere
     C                     MOVE '*'       NOMLON
     C                     MOVE '*'       NOMCOU
     C                     MOVE '*'       NOMEGA
     C           '*'       SCAN NOMLON    POS     30
     C           POS       DSPLY
     C           '*'       SCAN NOMCOU    POS
     C           POS       DSPLY
     C           '*'       SCAN NOMEGA    POS
     C           POS       DSPLY
     C                     SETON                     LR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

 40
 15
 30

Une étoile est placée à droite de chaque zone par MOVE puis repérée par SCAN : +10 donne 40, -15 donne 15, sans ajustement on reste à 30 (longueur de NOMREF).

Exemple 3 : Une zone liée à une zone de données

     H*  DEFN *NAMVAR : relier une zone du programme a une zone de donnees
     E                    CRE     1   1 80
     E                    SUP     1   1 80
     C*  Creation de la zone de donnees par une commande CL
     C                     Z-ADD80        LGR    155
     C                     MOVE CRE,1     CMD    80
     C                     CALL 'QCMDEXC'
     C                     PARM           CMD
     C                     PARM           LGR
     C*  ZONE (10 car.) est liee a la zone de donnees D3DTA
     C           *NAMVAR   DEFN D3DTA     ZONE   10
     C           *LOCK     IN   ZONE
     C                     MOVEL'Montpel' ZONE
     C                     OUT  ZONE
     C                     MOVEL' '       ZONE
     C                     IN   ZONE
     C           ZONE      DSPLY
     C                     MOVE SUP,1     CMD
     C                     CALL 'QCMDEXC'
     C                     PARM           CMD
     C                     PARM           LGR
     C                     SETON                     LR
**
CRTDTAARA DTAARA(JOBIRPG/D3DTA) TYPE(*CHAR) LEN(10)
**
DLTDTAARA DTAARA(JOBIRPG/D3DTA)

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

Montpel

Le programme crée la zone de données par CRTDTAARA (QCMDEXC), relie ZONE à D3DTA par *NAMVAR DEFN, la réserve par *LOCK IN, y écrit Montpel par OUT, la relit par IN, puis supprime la zone de données.

Le piège

Le mot clé de zone de données est *NAMVAR, pas *DTAARA. Avec *DTAARA en facteur 1, le compilateur répond QRG5073 : « La zone Facteur 1 pour l'opération DEFN ne contient pas *LIKE ou *NAMVAR », puis QRG7069 sur les IN et OUT qui suivent (« Le facteur 2 pour IN ou OUT n'est pas une zone de données »).

OUT sans réservation préalable : le travail s'arrête sur RPG0412, « Zone comm données non allouée pour sortie ». Faites *LOCK IN zone avant d'écrire (troisième exemple).

Un ajustement de longueur doit rester cohérent : -15 sur une zone de référence trop courte est refusé par QRG7007, « La longueur de la zone associée à DEFN est incorrecte. La longueur de la zone de base est prise par défaut. » Et la zone définie démarre à blanc : DEFN ne copie pas la valeur de la référence.

En RPG ILE full free

En RPG ILE, *LIKE devient le mot-clé LIKE d'une déclaration, avec un ajustement de longueur facultatif. Une zone de données se déclare avec le mot-clé DTAARA.

dcl-s nomcou like(nom : -15);
dcl-s nomlon like(nom : +10);
dcl-s mont like(solde);
dcl-s zone char(10) dtaara('D3DTA');
in *lock zone;
out zone;