Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Transferts de données

MOVEA

Transférer entre zones et tableaux

Copie une zone dans les éléments d'un tableau, un tableau dans une zone, ou un tableau dans un autre, élément par élément, à partir de l'indice voulu.

Syntaxe

     C                     MOVEAzone      ART
     C                     MOVEAzone      ART,3
     C                     MOVEAART       zone   12
     C                     MOVEAART       AUTRE
     C                     MOVEA'011'     *IN,50
Facteur 1 (18-27)
Non utilisé : on le laisse à blanc.
Facteur 2 (33-42)
La source : une zone, un littéral, un tableau, ou un tableau avec un indice de départ (ART,3).
Zone résultat (43-48)
La cible : un tableau, éventuellement avec un indice de départ (ART,3 ou *IN,50 pour les indicateurs), ou une zone. L'un des deux côtés au moins doit être un tableau.
Longueur (49-51)
Obligatoire quand la zone résultat n'est pas définie ailleurs.
Effet
Aucun indicateur n'est positionné. Le transfert se fait caractère après caractère, de gauche à droite, à partir du premier élément du tableau (ou de celui que l'indice désigne), sans tenir compte de la limite des éléments. Les éléments que la source ne couvre pas gardent leur valeur ; ce qui dépasse du dernier élément ou de la zone est ignoré.

À quoi ça sert

Un tableau est une suite de petits éléments de même longueur. MOVEA permet de le remplir d'un seul geste à partir d'une zone lue (un enregistrement découpé en 4 morceaux de 3 caractères) ou de reconstituer la zone à partir du tableau. On l'emploie aussi pour redécouper un tableau en éléments de longueur différente, et pour positionner d'un coup plusieurs indicateurs : MOVEA '011' *IN,50 éteint le 50 et allume le 51 et le 52.

Un tableau d'exécution se déclare en spécification E : nom en colonnes 27-32, nombre d'éléments en colonnes 36-39, longueur d'un élément en colonnes 40-42.

Exemple 1 : Zone vers tableau, tableau vers zone

     H*  MOVEA : zone vers tableau, puis tableau vers zone
     E                    ART         5  3
     C                     MOVEL'XXX'     ZONE   12
     C                     MOVEL'ABCDEFGH'ZONE
     C                     MOVE 'IJKL'    ZONE
     C                     MOVEL'ZZZ'     ART,5
     C                     MOVEAZONE      ART
     C           ART,1     DSPLY
     C           ART,4     DSPLY
     C           ART,5     DSPLY
     C                     MOVEAART       AUTRE  12
     C           AUTRE     DSPLY
     C                     SETON                     LR

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

ABC
JKL
ZZZ
ABCDEFGHIJKL

La zone de 12 caractères ABCDEFGHIJKL remplit les éléments 1 à 4 du tableau (3 caractères chacun) : ART,1 vaut ABC et ART,4 vaut JKL. L'élément 5, que la zone ne couvre pas, garde sa valeur ZZZ.

Dans l'autre sens, le tableau (5 éléments, 15 caractères) est copié dans une zone de 12 : le reste est ignoré sans erreur.

Exemple 2 : Indice de départ, tableau vers tableau, indicateurs

     H*  MOVEA : depart indice, tableau vers tableau, indicateurs
     E                    ART         4  3
     E                    PAIRE       6  2
     C                     MOVEL'ABCDEFGH'ZONE    8
     C                     MOVEAZONE      ART,3
     C           ART,1     DSPLY
     C           ART,3     DSPLY
     C           ART,4     DSPLY
     C                     MOVEL'ABC'     ART,1
     C                     MOVEL'DEF'     ART,2
     C                     MOVEL'GHI'     ART,3
     C                     MOVEL'JKL'     ART,4
     C                     MOVEAART       PAIRE
     C           PAIRE,1   DSPLY
     C           PAIRE,6   DSPLY
     C                     MOVEA'011'     *IN,50
     C           *IN50     IFEQ '0'
     C           '50 off'  DSPLY
     C                     END
     C           *IN52     IFEQ '1'
     C           '52 on'   DSPLY
     C                     END
     C                     SETON                     LR

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


ABC
DEF
AB
KL
50 off
52 on

Avec ART,3 comme résultat, la zone commence à l'élément 3 : ART,1 reste vide (première ligne blanche), ART,3 vaut ABC et ART,4 vaut DEF.

Le tableau de 4 éléments de 3 caractères est ensuite copié dans PAIRE, 6 éléments de 2 : PAIRE,1 vaut AB et PAIRE,6 vaut KL. Enfin MOVEA '011' *IN,50 éteint le 50 (le test affiche « 50 off ») et allume le 52 (« 52 on »).

Le piège

La zone doit être définie : MOVEA ART AUTRE sans longueur, avec AUTRE inconnu par ailleurs, est refusé : QRG7030, « La zone ou l'indicateur n'est pas défini ». Donnez la longueur en colonnes 49-51 (12 dans l'exemple).

Un nom de tableau ne doit pas commencer par TAB : le compilateur le prend pour une table et réclame le nombre d'éléments par enregistrement (QRG3039, « Le nombre de postes par enregistrement n'est pas précisé dans une définition de table »). Les exemples utilisent ART.

Aucun contrôle de longueur : ce qui dépasse est perdu sans message (la zone de 12 du premier exemple coupe le 5e élément).

En RPG ILE full free

En RPG ILE, on évite MOVEA : on déclare le tableau en sous-zone d'une structure de données qui recouvre la zone, et la zone et le tableau deviennent deux vues de la même mémoire. Pour un seul élément, on écrit directement art(3) = 'ABC'.

dcl-ds adr;
  zone char(12);
  art char(3) dim(4) pos(1);
end-ds;
zone = 'ABCDEFGHIJKL';
art(3) = 'XYZ';