Aller au contenu

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). Sans P, 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);