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 (
Hle premier,Lle 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;