Aller au contenu

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 *INFO ou *COMP n'interrompt rien. Un message *ESCAPE arrête la procédure : chez l'appelant, un MONITOR reçoit le statut 202 ; sans MONITOR, 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.