Instruction RPG full free · IBM i (AS/400) · Procédures, sous-programmes et erreurs
SND-MSG
Envoyer un message
Envoie un message texte au travail : message d'information, message d'achèvement, ou message d'échappement qui signale une erreur à l'appelant.
Syntaxe
SND-MSG message;
SND-MSG *INFO message;
SND-MSG *COMP message;
SND-MSG *ESCAPE message;
message- Le texte du message : une constante ou une expression caractère, par exemple
'Client ' + %char(numcli). *INFO- Message d'information. C'est le type utilisé quand on n'en précise aucun.
*COMP- Message d'achèvement : l'opération s'est terminée normalement.
*ESCAPE- Message d'échappement : met fin à la procédure ou au programme et signale une erreur à l'appelant, qui peut la capter avec
MONITOR. - Effet
- Le message apparaît dans l'historique du travail. Un message
*INFOou*COMPn'interrompt rien. Un message*ESCAPEarrête la procédure : chez l'appelant, unMONITORreçoit le statut 202 ; sansMONITOR, le programme principal s'arrête avec le message CPF9898 qui porte le texte envoyé.
À quoi ça sert
C'est l'instruction moderne pour parler à l'exploitant depuis un programme : suivi d'un traitement, anomalies détectées, fin de lot. Le texte est une expression, on le construit donc avec + et %char sans zone de travail.
Le type *ESCAPE est le mécanisme d'erreur standard de l'IBM i : une procédure refuse un montant négatif en envoyant un message d'échappement, et l'appelant décide quoi en faire.
Exemple 1 : Messages d'information et d'achèvement
**free
// SND-MSG : envoyer un message au travail, avec ou sans identifiant de message.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s ville char(20) inz('Montpellier');
dcl-s total packed(9:2) inz(1250.50);
// Message d'information simple (type *INFO par defaut).
snd-msg 'Client Dupont SA, ville [' + %trim(ville) + ']';
// Message avec texte construit.
snd-msg 'Encours : ' + %char(total) + ' EUR';
// Type explicite et message d'achevement.
snd-msg *info 'Traitement des 5 clients termine';
snd-msg *comp 'Fin normale du lot';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Client Dupont SA, ville [Montpellier]
Encours : 1250.50 EUR
Traitement des 5 clients termine
Fin normale du lot
Le texte est une expression : concaténation avec une zone nettoyée par %trim ou convertie par %char. Sans type, le message est *INFO.
Exemple 2 : Un message *ESCAPE capté par MONITOR
**free
// SND-MSG *ESCAPE : signaler une erreur a l'appelant, qui la capte avec MONITOR.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-pr verifier;
montant packed(9:2) const;
end-pr;
monitor;
verifier(320.00);
snd-msg 'Montant 320.00 accepte';
verifier(-320.00);
snd-msg 'Montant -320.00 accepte';
on-error;
snd-msg 'Erreur captee, statut ' + %char(%status);
endmon;
snd-msg 'Suite du programme';
*inlr = *on;
dcl-proc verifier;
dcl-pi *n;
montant packed(9:2) const;
end-pi;
if montant < 0;
snd-msg *escape 'Montant negatif refuse : ' + %char(montant);
endif;
end-proc;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Montant 320.00 accepte
Erreur captee, statut 202
Suite du programme
La procédure verifier accepte le montant 320.00 mais refuse -320.00 par snd-msg *escape. L'appelant, protégé par monitor, reçoit l'erreur avec le statut 202 : « Montant -320.00 accepte » n'est jamais affiché, et le programme continue après endmon.
Exemple 3 : Un message *ESCAPE sans MONITOR
**free
// SND-MSG *ESCAPE sans MONITOR : le programme s'arrete, la suite n'est pas executee.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s numcli packed(5:0) inz(300);
dcl-s solde packed(9:2) inz(-320.00);
snd-msg 'Controle du client ' + %char(numcli);
if solde < 0;
snd-msg *escape 'Solde negatif pour le client ' + %char(numcli);
endif;
snd-msg 'Solde accepte (jamais atteint)';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Controle du client 300
Erreur : CPF9898 - Solde negatif pour le client 300.
Sans MONITOR, le message d'échappement arrête le programme. L'erreur d'exécution est le message CPF9898, dont le texte est celui envoyé. La ligne « Solde accepte » n'est jamais exécutée.
Le piège
Un message *ESCAPE n'est pas un simple affichage : il interrompt le traitement. Dans le troisième exemple, aucune ligne après le snd-msg *escape n'est exécutée et le programme se termine sur CPF9898. Si vous voulez seulement informer, utilisez *INFO ou omettez le type. Si vous voulez signaler une erreur, assurez-vous que l'appelant a un MONITOR, sinon c'est le programme entier qui s'arrête.