Message Raising, Exceptions und Meldungen Systemvariablen (SY-MSGID, etc.)

Aus SAP-Wiki
Zur Navigation springenZur Suche springen

Siehe Fehlerbehandlung.

Siehe Transaktion SE91 (Nachrichtenpflege).

Siehe Funktionsbausteine.

An verschiedenen Stellen in SAP werden während der Ausführung von SAP-Standardcode Systemfelder gefüllt, die für die Fehleranalyse hilfreich sind. Speziell wenn man nicht weiß, welche Meldungen/Fehler ein SAP-Standardfunktionsbaustein erzeugen kann, ist es sinnvoll, diese generierten Meldungen zu nutzen.

So wird bei SAP-Funktionsbausteinen in der Regel schon ein Vorschlag für die Auswertung dieser Systemfelder generiert, wenn man einen Funktionsbaustein mit dem SAP-Codingassisten "Muster" aus der Entwicklungsentwicklung generieren lässt.

Moderne Programmierung arbeitet allerdings besser mit klassenbasierten Ausnahmen.

Muster Auswertung System-Fehlermeldungen

Bei vielen Funktionsbausteinen kann ein Muster generiert werden, der auch die Ausgabe der System-Meldungen beinhaltet.

Fehlerbehandlung0.jpg


Hier den Funktionsbaustein RP_LAST_DAY_OF_MONTHS

Fehlerbehandlung1.jpg


Es wird der Code generiert.

CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS'
  EXPORTING
    day_in                  =
*   IMPORTING
*   LAST_DAY_OF_MONTH       =
* EXCEPTIONS
*   DAY_IN_NO_DATE          = 1
*   OTHERS                  = 2
          .
IF sy-subrc <> 0.
   MESSAGE ID sy-msgid   "Nachrichtenklasse
         TYPE sy-msgty   "Typ (E = Error, S = Success, I = Info, A = Abbruch)
       NUMBER sy-msgno   "Nachrichtennummer
         WITH sy-msgv1   "Platzhaltervariable1
              sy-msgv2   "Platzhaltervariable2
              sy-msgv3   "Platzhaltervariable3
              sy-msgv4.  "Platzhaltervariable4
ENDIF.

Systemmessagefelder

Relevante Systemfelder bezüglich Messages:

  • SY-MSGID = Nachrichtenklasse
  • SY-MSGTY = Messagetyp (E = Error, S = Success, I = Info, A = Abbruch)
  • SY-MSGNO = Nachrichtennummer
  • SY-MSGV1 = Platzhalter mit erstem Variableninhalt
  • SY-MSGV2 = Platzhalter mit zweitem Variableninhalt
  • SY-MSGV3 = Platzhalter mit drittem Variableninhalt
  • SY-MSGV4 = Platzhalter mit viertem Variableninhalt

Message <message> raising <ausnahme>

Im Funktionsbaustein RP_LAST_DAY_OF_MONTHS gibt es ein Coding

Data: lv_datum type datum.
...
MESSAGE E401(5D) WITH lv_datum RAISING DAY_IN_NO_DATE.

Hiermit wird die Ausnahme DAY_IN_NO_DATE ausgelöst und in der Schnittstelle des Funktionsbausteins der SY-SUBRC = 1 gesetzt. Es werden die Systemfelder gefüllt

  • SY-MSGID = 5D
  • SY-MSGTY = E
  • SY-MSGNO = 401
  • SY-MSGV1 = Datum der Variablen lv_datum
  • SY-MSGV2 = space
  • SY-MSGV3 = space
  • SY-MSGV4 = space

Werden die Message-Systemfelder im Fuktionsbaustein gefüllt, kann man die Fehlermeldung im Aufrufer ausgeben in der Form

IF sy-subrc <> 0.
   MESSAGE ID sy-msgid 
         TYPE sy-msgty
       NUMBER sy-msgno
         WITH sy-msgv1
              sy-msgv2
              sy-msgv3
              sy-msgv4.
ENDIF.

Wenn das ausrufende Programm nicht mit einer Error-Meldung abbrechen soll, würde man nur eine Info-Meldung ausgeben und im aufrufenden Programm die Verarbeitung sauber beenden, um das Programm z. B. wieder auf den Selektionsbildschirm zurückzuführen.

 MESSAGE i401(5D) WITH lv_datum RAISING DAY_IN_NO_DATE.

und

IF sy-subrc <> 0.
   MESSAGE ID sy-msgid 
         TYPE sy-msgty
       NUMBER sy-msgno
         WITH sy-msgv1
              sy-msgv2
              sy-msgv3
              sy-msgv4.
 return.
ENDIF.

Man sollte dabei kontrollieren, ob im Funktionsbaustein bei einer Fehlerkonstellation die Systemfelder auch fortgeschrieben werden. Es kann sein, dass bei einer Fehlersituation SAP die für die jeweilige Situation relevante Fehlersituation in die entsprechenden System-Message-Felder geschrieben hat. Aber es können auch völlig irreführende Meldungen in den Systemfeldern stehen. Das verwirrt dann den User mehr als es hilft und dann sollte der Aufrufer eine allgemeine Fehlermeldung ausgeben "Fehler beim Funktionsbaustein <funktionsbaustein>"..

Daher ist es oft besser im Funktionsbaustein, bzw. in der Methode, die Meldung direkt als Messagefenster auszugeben und im Aufruferprogramm die Meldung nicht auszugeben, sondern nur den Workflow des Programms passend zur aufgetretenen Meldung zu berücksichtigen. So vereinheitlicht man die zu sehenden Meldungen, da nun von mehreren Aufrufern die Meldungen gleich ausgegeben werden.

MESSAGE <meldung>.
RAISE <ausnahme>.

Web-Links