Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Calculs

SUB

Soustraire

Soustrait le facteur 2 du facteur 1 dans la zone résultat ; sans facteur 1, retire le facteur 2 de la zone résultat.

Syntaxe

     C           facteur1  SUB  facteur2  result  72
     C                     SUB  facteur2  result  72
     C           facteur1  SUB  facteur2  result  72H
Facteur 1 (18-27)
Le nombre dont on retire. Facultatif : s'il est absent, c'est la zone résultat (result = result - facteur 2).
Facteur 2 (33-42)
Le nombre retiré : zone numérique ou littéral.
Zone résultat (43-48)
Reçoit la différence, avec son signe.
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 contient la différence, négative si le facteur 2 est le plus grand. Si elle est trop courte, les chiffres de gauche sont perdus sans erreur, le signe restant celui de la vraie différence.

À quoi ça sert

SUB calcule un solde, un écart, un reste à livrer. Le signe est conservé dans la zone : un stock de 40 moins une commande de 65 donne −25, ce qui permet de détecter le manque.

Exemple 1 : Solde et stock manquant

     H*  SUB : deux et trois operandes, resultat negatif
     C                     Z-ADD1000      SOLDE   72
     C                     SUB  250.75    SOLDE
     C           'Solde'   DSPLY
     C           SOLDE     DSPLY
     C                     Z-ADD40        STOCK   50
     C                     Z-ADD65        CMDE    50
     C           STOCK     SUB  CMDE      MANQUE  50
     C           'Manque'  DSPLY
     C           MANQUE    DSPLY
     C                     SETON                     LR

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

Solde
  74925
Manque
   25-

SUB 250.75 SOLDE retire 250,75 de 1000,00 : 74925 pour 749,25. Avec trois opérandes, STOCK SUB CMDE MANQUE donne −25, que DSPLY affiche 25- (signe en suffixe).

Exemple 2 : Troncature d'un résultat négatif

     H*  SUB : troncature des chiffres de gauche
     C                     Z-ADD0         CPT     30
     C                     SUB  1234      CPT
     C           'Zone 3'  DSPLY
     C           CPT       DSPLY
     C                     Z-ADD0         LARGE   50
     C                     SUB  1234      LARGE
     C           'Zone 5'  DSPLY
     C           LARGE     DSPLY
     C                     SETON                     LR

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

Zone 3
234-
Zone 5
 1234-

0 − 1234 vaut −1234. Une zone de 5 chiffres le contient (1234-) ; une zone de 3 chiffres ne garde que 234- : le signe reste, le chiffre de gauche disparaît, sans erreur.

Le piège

Un résultat trop grand est coupé à gauche, sans message. Le second exemple montre 234- au lieu de 1234- : le montant est faux mais plausible, ce qui rend l'erreur difficile à voir.

Le signe est mémorisé dans la zone. Une zone numérique « condensée » accepte les négatifs ; testez le résultat avec COMP ou IFLT avant d'afficher ou d'écrire un montant négatif.

En RPG ILE full free

En RPG ILE full free, la soustraction est une expression.

dcl-s solde packed(7:2);
solde = 1000;
solde -= 250.75;
manque = stock - cmde;