Aller au contenu

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

MHHZO

Copier la zone d'un caractère

Recopie la zone (les 4 bits de gauche) d'un caractère du facteur 2 sur la zone d'un caractère du résultat, sans toucher à la partie chiffre.

Syntaxe

     C                     MHHZOsource    cible
     C                     MHLZOsource    cible
     C                     MLHZOsource    cible
     C                     MLLZOsource    cible
Facteur 2 (33-42)
La source : une zone ou un littéral. Seul un caractère compte : le premier (H, à gauche) ou le dernier (L, à droite) selon l'opération.
Zone résultat (43-48)
La cible, alphanumérique ou numérique. Seule la zone du premier ou du dernier caractère est modifiée.
Effet
Aucun indicateur n'est positionné. La première lettre du code dit quel caractère de la source est lu (H le premier, L le dernier), la deuxième quel caractère de la cible est modifié. MHHZO : premier vers premier. MHLZO : premier vers dernier. MLHZO : dernier vers premier. MLLZO : dernier vers dernier. La partie chiffre (les 4 bits de droite) de la cible n'est jamais changée. Dans une zone numérique, la zone du dernier chiffre est le signe.

À quoi ça sert

Ces quatre opérations travaillent sur la moitié « zone » d'un caractère. En EBCDIC, A à I ont la zone C, J à R la zone D, les chiffres la zone F. Pour un nombre, la zone du dernier chiffre est le signe : D pour négatif, C pour positif.

On les rencontre dans de vieux programmes pour poser ou retirer un signe sur un montant, ou transformer un caractère en changeant seulement sa zone.

Exemple 1 : Les quatre opérations sur « 12 »

     H*  MHHZO MHLZO MLHZO MLLZO : copier une zone (4 bits de gauche)
     C                     MOVEL'12'      R       2
     C                     MHHZO'AJ'      R
     C           R         DSPLY
     C                     MOVEL'12'      R       2
     C                     MHLZO'AJ'      R
     C           R         DSPLY
     C                     MOVEL'12'      R       2
     C                     MLHZO'AJ'      R
     C           R         DSPLY
     C                     MOVEL'12'      R       2
     C                     MLLZO'AJ'      R
     C           R         DSPLY
     C                     SETON                     LR

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

A2
1B
J2
1K

La source est AJ (A de zone C, J de zone D) et la cible 12 à chaque fois. MHHZO pose la zone du premier caractère de la source (C) sur le premier de la cible : A2. MHLZO la pose sur le dernier : 1B. MLHZO prend la zone du dernier caractère de la source (D) pour le premier de la cible : J2. MLLZO la pose sur le dernier : 1K. Les chiffres 1 et 2 restent intacts.

Exemple 2 : Poser le signe moins sur un montant alphanumérique

     H*  MLLZO : poser le signe moins sur un montant alpha
     C                     MOVE '-'       SIGNE   1
     C                     MOVE '00125'   MONT    5
     C           SIGNE     IFEQ '-'
     C                     MLLZO'J'       MONT
     C                     END
     C                     MOVE MONT      NUM     50
     C           NUM       DSPLY
     C                     SETON                     LR

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

  125-

Le montant 00125 est lu avec le signe - dans une zone à part. MLLZO 'J' donne au dernier caractère la zone D de J : la zone devient 0012N. Le MOVE vers une zone numérique reprend ce signe : -125.

Exemple 3 : Changer le signe d'une zone numérique

     H*  MLLZO : changer le signe d'une zone numerique
     C                     Z-ADD125       NUM     50
     C                     MLLZO'J'       NUM
     C           NUM       DSPLY
     C                     MLLZO'A'       NUM
     C           NUM       DSPLY
     C                     SETON                     LR

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

  125-
  125

Le nombre 125 devient -125 après MLLZO 'J' (zone D), puis redevient 125 avec MLLZO 'A' (zone C).

Le piège

Le « H » et le « L » désignent le caractère, pas la moitié d'octet. MLHZO ne prend pas « la moitié basse » : il prend la zone du dernier caractère de la source pour la poser sur le premier de la cible (premier exemple : J2).

Seule la zone est copiée : la partie chiffre de la cible est conservée. Le caractère obtenu n'est donc pas la source recopiée, et peut ne pas être imprimable si les chiffres ne s'y prêtent pas.

En RPG ILE full free

Il n'y a pas d'équivalent direct. Pour le cas courant, changer le signe d'un nombre, on multiplie simplement par -1 ; pour retrouver le signe d'un montant alphanumérique, on teste le caractère et on affecte la valeur numérique.

montant = montant * -1;
if signe = '-';
  montant = -%dec(texte : 5 : 0);
endif;