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)
*LIKEpour copier la définition d'une zone ;*NAMVARpour 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 :+10allonge,-15raccourcit, 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 :
DEFNsert à la compilation, comme une spécification de définition. La zone créée avec*LIKEa le type, la longueur (ajustée) et les décimales de la zone de référence. La zone définie avec*NAMVARpeut être lue parINet écrite parOUT.
À 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;