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. SansP, 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';