Aller au contenu

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