MCH1211
Tentative de division par zéro pour opération en virgule fixe.
Gravité 40 · Fin anormale du programme ou de la fonction
Comment s'en sortir
Le programme a divisé un nombre par zéro. Le cas typique : un pourcentage ou une moyenne calculés sur un total qui, pour une fois, vaut zéro.
Les causes les plus fréquentes
- Un diviseur qui peut valoir zéro dans les données réelles : quantité commandée à zéro, nombre de jours ouvrés d'un mois sans activité, total d'un client sans ventes.
- Une zone non alimentée : le diviseur vient d'un enregistrement non trouvé (
CHAINsans%FOUND) et garde sa valeur initiale, zéro.
Diagnostiquer
En RPG ILE, le message RPG associé est RNQ0102 (tentative de division par zéro), avec le numéro d'instruction de la division.
Corriger
Testez le diviseur avant de diviser, et décidez de ce que vaut le résultat dans ce cas :
if quantite <> 0;
prixUnitaire = montant / quantite;
else;
prixUnitaire = 0; // ou signaler l'anomalie
endif;
En SQL, NULLIF évite l'erreur : montant / NULLIF(quantite, 0) renvoie NULL au lieu de planter.
Ne vous contentez pas de mettre le résultat à zéro partout : une marge ou un prix unitaire à zéro peut passer inaperçu dans un état et fausser des décisions. Choisissez, cas par cas, entre zéro, une valeur nulle ou une anomalie signalée.
Ce que dit IBM
IBM ne fournit pas d'aide détaillée pour ce message.
Sur votre IBM i
Afficher la description complète du message :
DSPMSGD RANGE(MCH1211) MSGF(QSYS/QCPFMSG)
L'intercepter dans un programme CL, quand il est envoyé comme message d'échappement :
MONMSG MSGID(MCH1211) EXEC(DO)
/* traitement de l'erreur */
ENDDO