Code opération RPG III / RPG/400 · IBM i (AS/400) · Calculs
Z-SUB
Mettre à zéro et soustraire
Met la zone résultat à zéro puis en retranche le facteur 2 : elle reçoit donc l'opposé du facteur 2.
Syntaxe
C Z-SUBfacteur2 result 72
C Z-SUBfacteur2 result 72H
- Facteur 1 (18-27)
- Toujours vide.
- Facteur 2 (33-42)
- La valeur dont on prend l'opposé : zone numérique ou littéral.
- Zone résultat (43-48)
- Reçoit l'opposé du facteur 2.
- Longueur (49-51)
- Longueur totale de la zone résultat, décimales comprises. Renseignée quand la zone apparaît pour la première fois dans le programme : c'est ce qui la définit. Sans longueur, une zone encore inconnue provoque
QRG7030, « La zone ou l'indicateur n'est pas défini ». - Décimales (52)
- Nombre de décimales de la zone résultat ; 0 pour un entier.
- Colonne 53
Hdemande l'arrondi (demi supérieur) : si le résultat a plus de décimales que la zone résultat, le résultat est arrondi à la valeur la plus proche (1,09945 devient 1,10 pour deux décimales). SansH, les décimales en trop sont simplement coupées, sans arrondi.- Indicateurs de conditionnement (9-17)
- Facultatif : l'opération n'est exécutée que si les indicateurs indiqués ont l'état demandé.
- Effet
- La zone résultat vaut 0 moins le facteur 2 : même valeur, signe inversé. Mêmes règles de troncature que
Z-ADD.
À quoi ça sert
Z-SUB change le signe d'un nombre sans multiplier par −1 : transformer un solde débiteur en dette à afficher, un avoir en montant positif, ou préparer une valeur négative.
Exemple 1 : Z-SUB écrase, SUB retranche
H* Z-SUB : Z-SUB ecrase la zone, SUB retranche
C Z-ADD1000 TOTAL 70
C Z-SUB50 TOTAL
C 'Z-SUB' DSPLY
C TOTAL DSPLY
C Z-ADD1000 TOTAL
C SUB 50 TOTAL
C 'SUB' DSPLY
C TOTAL DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Z-SUB
50-
SUB
950
TOTAL contient 1000. Z-SUB 50 TOTAL ne retire pas 50 : il écrase la zone par −50, affiché 50-. Le SUB 50 TOTAL fait sur la même valeur de départ donne bien 950.
Exemple 2 : Dette d'un client
H* Z-SUB : dette d'un client a partir du solde
FCLIENT3 IF E K DISK
C Z-ADD300 NUMERO 50
C NUMERO CHAINCLIENT3 99
C Z-SUBSOLDE DETTE 92
C 'Solde' DSPLY
C SOLDE DSPLY
C 'Dette' DSPLY
C DETTE DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Solde
32000-
Dette
32000
Le client 300 a un solde de −320,00 (32000-). Z-SUB SOLDE DETTE donne la dette en positif : 32000.
Le piège
Z-SUB n'est pas SUB. Z-SUB 50 TOTAL remet la zone à zéro avant de soustraire : l'ancien contenu (1000) est perdu et la zone vaut −50 (premier exemple). Pour retirer 50 d'un total existant, c'est SUB 50 TOTAL.
Le résultat est négatif : Z-SUB 50 range −50. Pour obtenir un montant positif à partir d'un solde négatif, appliquez-le sur la valeur négative (second exemple).
En RPG ILE full free
En RPG ILE full free, on écrit l'opposé avec le signe moins.
remise = -50;
posit = -remise;
dette = -solde;