Aller au contenu

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

MOVEL

Transférer en alignant à gauche

Copie le facteur 2 dans la zone résultat en alignant les deux sur leur premier caractère ou premier chiffre, sans rien calculer ni arrondir.

Syntaxe

     C                     MOVELsource    cible   5
     C                     MOVELsource    cible   8 P
Facteur 1 (18-27)
Non utilisé : on le laisse à blanc.
Facteur 2 (33-42)
La source : une zone, un littéral, une constante figurative ou un élément de tableau.
Zone résultat (43-48)
La cible. Son type peut différer de celui de la source.
Longueur (49-51)
Longueur de la zone résultat quand c'est ici qu'elle est définie.
Décimales (52)
Nombre de décimales, si la zone résultat est numérique et définie ici.
Colonne 53
P : le résultat est rempli de blancs à droite de la valeur transférée. Sans P, la fin de la cible est conservée.
Effet
Aucun indicateur n'est positionné. La zone résultat reçoit les premiers caractères (ou chiffres) du facteur 2. Si la source est plus longue, sa fin est perdue ; si elle est plus courte, la fin de la cible reste en place, sauf avec P. Les décimales ne comptent pas : une zone de 7 chiffres dont 2 décimales est lue comme un entier de 7 chiffres.

À quoi ça sert

MOVEL est l'outil des libellés : on pose le début d'un message avec MOVEL, puis on complète avec MOVE ou CAT. On l'emploie aussi pour initialiser une zone alphanumérique (MOVEL 'OK' ETAT) ou pour extraire le début d'une zone, par exemple les 2 premiers chiffres d'un code postal.

Exemple 1 : Début conservé, fin de la cible intacte

     H*  MOVEL : aligne a gauche, le reste de la zone est conserve
     C                     MOVEL'ABCDEFGH'GAUCHE  5
     C                     MOVE 'ABCDEFGH'DROITE  5
     C           GAUCHE    DSPLY
     C           DROITE    DSPLY
     C                     MOVEL'12345678'ZONE    8
     C                     MOVEL'AB'      ZONE
     C           ZONE      DSPLY
     C                     MOVEL'CD'      ZONE      P
     C                     MOVE ZONE      FIN     3
     C           FIN       IFEQ *BLANKS
     C           'Fin vide'DSPLY
     C                     END
     C                     SETON                     LR

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

ABCDE
DEFGH
AB345678
Fin vide

Dans une zone de 5, MOVEL garde ABCDE alors que MOVE garde DEFGH.

La zone de 8 contient 12345678 : MOVEL 'AB' donne AB345678, la fin n'a pas été touchée. Avec P en colonne 53, les trois derniers caractères de la zone deviennent des blancs, ce que le test FIN IFEQ *BLANKS confirme.

Exemple 2 : Numérique vers alphanumérique, troncature et signe

     H*  MOVEL : numerique vers alpha, troncature et signe
     C                     Z-ADD12345.67  PRIX    72
     C                     MOVELPRIX      ENT     50
     C           ENT       DSPLY
     C                     MOVELPRIX      TXT4    4
     C           TXT4      DSPLY
     C                     Z-ADD-234      MONT    30
     C                     MOVELMONT      TXT3    3
     C           TXT3      DSPLY
     C                     MOVELMONT      TXT2    2
     C           TXT2      DSPLY
     C                     MOVE MONT      TXT2
     C           TXT2      DSPLY
     C                     SETON                     LR

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

12345
1234
23M
23
3M

Le prix 12345,67 (7 chiffres, 2 décimales) donne 12345 dans une zone numérique de 5 et 1234 dans une zone alphanumérique de 4 : on prend les premiers chiffres, la virgule n'existe pas.

Le nombre -234 donne 23M dans une zone de 3 (le signe est porté par le dernier chiffre), mais seulement 23 dans une zone de 2 : le signe est parti avec le 4 tronqué. Avec MOVE, la même zone de 2 reçoit 3M.

Le piège

MOVEL d'un nombre négatif dans une zone trop courte perd le signe : -234 devient 23 (deuxième exemple), qui ne se distingue plus de 23. Prévoyez une zone assez longue.

Sans P, la fin de la cible survit : MOVEL 'AB' dans 12345678 donne AB345678 (premier exemple). Pour effacer le reste, mettez P en colonne 53.

En RPG ILE full free

L'affectation du RPG ILE aligne à gauche et complète de blancs, ce qui correspond à MOVEL(P). Pour garder la fin de la cible comme le MOVEL sans P, on écrit seulement la partie voulue avec %SUBST.

zone = 'AB';
%subst(zone : 1 : 2) = 'AB';