L

Catégorie
ABAP-Statements
Publié
Auteur
Johannes

L’instruction MESSAGE sert a :

  1. Afficher des messages : Communiquer des informations, des messages de succes, des avertissements ou des messages d’erreur a l’utilisateur (generalement dans la barre de statut, une fenetre popup ou dans le journal).
  2. Influencer le deroulement du programme : Selon le type de message (voir ci-dessous), l’instruction peut interrompre l’etape de traitement en cours, annuler l’ensemble de la transaction ou meme declencher une erreur d’execution (dump).

Les messages ne sont pas, par defaut, integres directement dans le code sous forme de texte, mais sont geres de maniere centralisee dans des classes de messages (transaction SE91). Cela permet une traduction et une maintenance faciles.

Syntaxe

La forme la plus courante est la suivante :

MESSAGE <type><nr>(<classe>)
[WITH <valeur1> <valeur2> <valeur3> <valeur4>] " Remplir les espaces reserves
[RAISING <classe_exception>] " Lever une exception (dans les fonctions/methodes)
[INTO <variable>]. " Enregistrer le texte du message dans une variable (au lieu de l'afficher)

Il existe aussi une forme (rarement recommandee) pour les litteraux de texte ad hoc :

MESSAGE <texte_litteral> TYPE <type>.

Composants

  • <type> (Type de message) : Une seule lettre qui determine le comportement. C’est la partie la plus importante !

    • I : Information - Affiche le message (souvent popup). Le programme attend une confirmation (Entree/OK) puis continue.
    • S : Success (Succes) - Affiche le message dans la barre de statut de l’ecran suivant. Le programme continue immediatement.
    • W : Warning (Avertissement) - Affiche un avertissement (souvent popup ou barre de statut). Les champs de saisie restent souvent prets. Le programme attend une confirmation puis continue. Depend du contexte.
    • E : Error (Erreur) - Affiche un message d’erreur. Interrompt generalement l’etape de traitement en cours (par ex. module PAI, START-OF-SELECTION). Les champs de saisie sont souvent rendus modifiables a nouveau. Ne termine pas le programme entier.
    • A : Abend (Abandon) - Affiche le message et annule immediatement l’ensemble de la transaction ! Effectue un rollback de la base de donnees. A utiliser avec grande precaution !
    • X : eXit (Dump) - Provoque une erreur d’execution (short dump). Le message est affiche dans le dump. Pour les erreurs de programme graves et inattendues.
  • <nr> : Le numero de message a trois chiffres (sous forme de litteral ou de variable) de la classe de messages (000-999).

  • (<classe>) : L’ID de la classe de messages (litteral ou variable, par ex. 'ZMYMSG') de la transaction SE91, dans laquelle le message <nr> est defini. Cette partie peut etre omise si une classe de messages standard est declaree globalement dans le programme avec REPORT ... MESSAGE-ID ....

  • WITH <valeur1> ... <valeur4> (Optionnel) : Ici vous passez jusqu’a quatre valeurs (variables, litteraux) qui remplacent les espaces reserves &1, &2, &3, &4 dans le texte du message. Un simple & est rempli sequentiellement par les valeurs.

    • Exemple de texte dans SE91 : Article &1 pour le site &2 non trouve.
    • Appel : MESSAGE E005(ZMAT) WITH lv_matnr lv_werks.
  • RAISING <classe_exception> (Optionnel) : Utile uniquement dans les modules fonctions et les methodes. Leve en plus du message une exception basee sur une classe, que l’appelant peut intercepter avec TRY ... CATCH. Permet une gestion structuree des erreurs.

  • INTO <variable> (Optionnel) : Le message n’est pas affiche. Le texte du message formate est ecrit dans la <variable> de type caractere. Le programme continue immediatement. Utile pour la journalisation.

Classes de messages (SE91)

L’utilisation des classes de messages est standard et offre des avantages :

  • Traduction : Les messages peuvent etre traduits de maniere centralisee.
  • Maintenance : Les textes sont modifiables en un seul endroit.
  • Reutilisation : Les memes messages peuvent etre utilises par differents programmes.
  • Contexte : Utilisation d’espaces reserves (&, &1…).

Champs systeme

Apres l’affichage d’un message (pas avec INTO), les champs systeme comme sy-msgid (classe), sy-msgty (type), sy-msgno (numero) et sy-msgv1 a sy-msgv4 (valeurs de WITH) sont renseignes. Attention : sy-subrc n’est pas renseigne de maniere fiable par MESSAGE lui-meme pour indiquer le succes/echec - la logique resulte principalement du type de message (E, A, X).

Exemples

" Hypothese : La classe de messages ZMSG existe
" NNr | Texte
" ---|--------------------------------------
" 001 | Traitement termine avec succes.
" 002 | L'article &1 n'a pas pu etre verrouille.
" 003 | Veuillez entrer un numero de commande.
" 004 | La date &1 est dans le passe. Continuer ?
" 005 | Erreur interne (&1) dans la routine &2 ! Abandon !
DATA lv_matnr TYPE matnr VALUE 'M-01'.
DATA lv_date TYPE d VALUE sy-datum - 1.
DATA lv_text TYPE string.
" Message de succes (Type S - apparait dans la barre de statut de l'ecran suivant)
MESSAGE s001(ZMSG).
" Message d'erreur (Type E - arrete generalement le bloc en cours)
IF lv_matnr IS INITIAL.
MESSAGE e003(ZMSG).
RETURN. " Sortie explicite necessaire si pas dans PAI etc.
ENDIF.
" Avertissement (Type W - L'utilisateur doit confirmer)
IF lv_date < sy-datum.
MESSAGE w004(ZMSG) WITH lv_date.
" Le programme s'arrete ici jusqu'a ce que l'utilisateur confirme.
ENDIF.
" Information (Type I - L'utilisateur doit confirmer)
MESSAGE i002(ZMSG) WITH lv_matnr.
" Abandon (Type A - La transaction est terminee !) - A UTILISER AVEC GRANDE PRECAUTION
* MESSAGE a005(ZMSG) WITH sy-subrc 'MA_ROUTINE'.
" Ecrire le message dans une variable (Type S - n'est pas affiche)
MESSAGE s001(ZMSG) INTO lv_text.
WRITE: / 'Message dans la variable :', lv_text.

Remarques importantes / Bonnes pratiques

  • Utilisez des classes de messages pour tous les messages qui doivent etre traduits ou qui apparaissent plusieurs fois.
  • Choisissez le type de message (I, S, W, E, A, X) consciemment, selon la reaction souhaitee du programme.
  • Utilisez avec parcimonie les types A (Abandon) et X (Dump). Ils sont destines aux erreurs graves et irreparables.
  • Utilisez la clause WITH pour donner a l’utilisateur des informations contextuelles (valeurs, noms de champs, etc.) dans le message.
  • Dans les modules fonctions et les methodes, preferez RAISING avec des classes d’exception a MESSAGE E... pour une communication d’erreur propre avec l’appelant.