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
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 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;