Code opération RPG III / RPG/400 · IBM i (AS/400) · Transferts de données
MOVE
Transférer en alignant à droite
Copie le facteur 2 dans la zone résultat en alignant les deux sur leur dernier caractère ou dernier chiffre, sans rien calculer ni arrondir.
Syntaxe
C MOVE source cible 5
C MOVE source 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 (
*BLANKS,*ZEROS…) ou un élément de tableau. - Zone résultat (43-48)
- La cible. Elle peut être de type différent de la source (alphanumérique vers numérique et inverse).
- 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 d'abord rempli de blancs avant le transfert (zone alphanumérique). SansP, la partie de la cible que la source ne couvre pas est conservée.- Effet
- Aucun indicateur n'est positionné. La zone résultat reçoit les derniers caractères (ou chiffres) du facteur 2, en comptant de la droite. Si la source est plus longue, son début est perdu ; si elle est plus courte, le début de la cible reste en place, sauf avec
P. Vers une zone numérique, seule la partie chiffre de chaque caractère est prise, et le signe vient de la zone du dernier caractère de la source. Les décimales ne comptent pas : les chiffres sont alignés comme des entiers.
À quoi ça sert
MOVE est l'opération de transfert la plus utilisée du RPG III. Elle sert à alimenter une zone avec une constante, à reprendre la fin d'un code (les 5 derniers caractères d'une référence), à convertir un numéro saisi en alphanumérique en numérique, ou à construire un libellé par morceaux avec MOVEL.
Elle ne fait aucun calcul : pour transférer une valeur numérique avec ses décimales et son arrondi, utilisez Z-ADD.
Exemple 1 : Aligné à droite, aligné à gauche, remplissage
H* MOVE : aligne a droite, MOVEL : aligne a gauche
C MOVEL'ABCDEFGH'GAUCHE 5
C MOVE 'ABCDEFGH'DROITE 5
C GAUCHE DSPLY
C DROITE DSPLY
C MOVE 'AB' ZONE 8
C MOVEL'12345678'ZONE
C MOVE 'AB' ZONE
C ZONE DSPLY
C MOVE 'CD' ZONE P
C ZONE CAT '|':0 AFF 9
C AFF DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
ABCDE
DEFGH
123456AB
CD|
Le même littéral ABCDEFGH est transféré dans une zone de 5 : MOVEL garde le début (ABCDE), MOVE garde la fin (DEFGH).
Ensuite ZONE contient 12345678 et MOVE 'AB' remplace seulement les deux derniers caractères : 123456AB. Avec P en colonne 53, la zone est d'abord vidée : MOVE 'CD' donne six blancs puis CD.
Exemple 2 : Alphanumérique vers numérique, et inverse
H* MOVE : alpha vers numerique et numerique vers alpha, signe
C MOVE '00123' NUM 50
C NUM DSPLY
C Z-ADD-234 MONT 50
C MOVE MONT TXT 5
C TXT DSPLY
C Z-ADD12345.67 PRIX 72
C MOVE PRIX ENT 50
C ENT DSPLY
C MOVELPRIX ENT2 50
C ENT2 DSPLY
C Z-ADD0 NUM
C MOVE 'A1B2' NUM
C NUM DSPLY
C Z-ADD0 NUM
C MOVE '12J' NUM
C NUM DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
123
0023M
34567
12345
1122
121-
'00123' devient le nombre 123. Le nombre -234 transféré dans une zone alphanumérique de 5 donne 0023M : le signe est porté par le dernier caractère (M représente 4 négatif).
Le prix 12345,67 transféré avec MOVE dans une zone de 5 chiffres donne 34567 (les 5 derniers chiffres, virgule ignorée) alors que MOVEL donne 12345. Enfin A1B2 donne 1122 : seule la partie chiffre de chaque caractère est conservée, et 12J donne -121 car J porte un signe négatif.
Le piège
Sans P, MOVE ne vide pas la zone résultat : MOVE 'AB' dans 12345678 donne 123456AB (premier exemple). Pour obtenir « AB » aligné à droite sur du blanc, mettez P en colonne 53.
Le transfert alpha vers numérique ne contrôle rien : A1B2 est accepté et devient 1122, et un dernier caractère comme J rend le nombre négatif (deuxième exemple). Contrôlez la saisie avant le MOVE.
En RPG ILE full free
En RPG ILE, l'affectation = aligne à gauche et complète de blancs (équivalent de MOVEL(P)). L'alignement à droite s'écrit avec EVALR. Pour passer de l'alphanumérique au numérique, on utilise la fonction %DEC et, dans l'autre sens, %CHAR, qui contrôlent la valeur.
zone = 'AB';
evalr zone = 'AB';
num = %dec(texte : 5 : 0);
texte = %char(montant);