Message Raising, Exceptions und Meldungen Systemvariablen (SY-MSGID, etc.)
Siehe Fehlerbehandlung.
Siehe Kategorie: Fehlerverarbeitung.
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.
Hier den Funktionsbaustein RP_LAST_DAY_OF_MONTHS
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>.