Aller au contenu

Instruction RPG full free · IBM i (AS/400) · Données et calculs

EVAL-CORR

Copier les sous-zones de même nom

Copie d'une structure de données vers une autre toutes les sous-zones qui portent le même nom dans les deux, en convertissant leur type.

Syntaxe

EVAL-CORR structure-cible = structure-source;
structure-cible
La structure qui reçoit. Seules ses sous-zones dont le nom existe aussi dans la source sont modifiées.
structure-source
La structure d'où l'on copie. Ses sous-zones sans équivalent dans la cible sont ignorées.
Effet
Modifie les sous-zones communes de la cible, chacune étant convertie au type et à la longueur de la zone de la cible. Les autres sous-zones de la cible gardent leur valeur. Ne positionne ni %FOUND ni indicateur.

À quoi ça sert

Quand deux structures décrivent presque la même chose, par exemple l'enregistrement d'un fichier et la ligne d'un écran, ou une structure de saisie et une fiche, on évite d'écrire une affectation par zone. EVAL-CORR apparie les sous-zones par leur nom et copie celles qui correspondent.

C'est le descendant de l'opération en colonnes MOVE CORR d'autres langages : on gagne en brièveté, mais aussi en sécurité quand un format de fichier gagne une zone, puisque la copie suit le nom et non la position.

Exemple 1 : Saisie vers fiche

**free
// EVAL-CORR : copier les sous-zones de meme nom d'une structure vers une autre.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-ds saisie qualified;
  nom    char(20)     inz('Dupont SA');
  ville  char(12)     inz('Montpellier');
  solde  zoned(7:2)   inz(1250.50);
  saisi  char(8)      inz('20260930');
end-ds;

dcl-ds fiche qualified;
  numcli packed(5:0)  inz(100);
  ville  varchar(20);
  nom    char(20);
  solde  packed(9:2);
end-ds;

eval-corr fiche = saisie;
snd-msg 'Nom    : [' + fiche.nom + ']';
snd-msg 'Ville  : [' + fiche.ville + ']';
snd-msg 'Solde  : [' + %char(fiche.solde) + ']';
snd-msg 'Numcli : [' + %char(fiche.numcli) + ']';

*inlr = *on;

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

Nom    : [Dupont SA           ]
Ville  : [Montpellier ]
Solde  : [1250.50]
Numcli : [100]

La structure saisie et la structure fiche ont trois noms en commun : nom, ville et solde. L'ordre est différent, les types aussi : le solde passe de zoned(7:2) à packed(9:2), la ville de char(12) à varchar(20) (elle garde son blanc final).

La zone saisi, qui n'existe que dans la source, est ignorée ; numcli, qui n'existe que dans la cible, garde sa valeur 100.

Exemple 2 : Une zone trop courte

**free
// EVAL-CORR : une sous-zone trop courte est tronquee sans erreur.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-ds source qualified;
  nom   char(20) inz('Bernard Transports');
  ville char(12) inz('Brest');
end-ds;

dcl-ds cible qualified;
  nom   char(8)  inz('INCONNU');
  ville char(12) inz('Lyon');
  pays  char(2)  inz('FR');
end-ds;

eval-corr cible = source;
snd-msg 'Nom   : [' + cible.nom + ']';
snd-msg 'Ville : [' + cible.ville + ']';
snd-msg 'Pays  : [' + cible.pays + ']';

*inlr = *on;

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

Nom   : [Bernard ]
Ville : [Brest       ]
Pays  : [FR]

Les structures partagent nom et ville. La cible a une zone pays inconnue de la source : elle reste à FR. Mais son nom ne fait que 8 caractères : Bernard Transports est coupé en Bernard sans aucun message.

Le piège

La copie suit le nom, pas le contenu. Deux sous-zones de même nom sont copiées même si ce n'est pas ce que vous aviez en tête, et une sous-zone dont le nom diffère d'une lettre n'est pas copiée, sans avertissement. De plus, comme pour EVAL, une cible trop courte tronque en silence : dans le deuxième exemple, le nom de 18 caractères devient Bernard .

Les sous-zones absentes de l'autre structure ne sont pas remises à blanc : pays garde FR. Si vous voulez une cible propre, faites d'abord un CLEAR.