[ABAP] Grundaufbau ABAP-Programm / Ereignisse

* globaler Deklarationsteil
TYPES ... " Definitionen
DATA ...  " Datenobjekte
CLASS ... " Klassen

* Implementierungsteil mit Ereignisblöcken
* Ereignis beim Laden eines Programms in die interne Sitzung
LOAD-OF-PROGRAM.
  " häufig für Autorisierungsabfrage genutzt

* Ereignis vor Prozessierung des Selektionsbildes
INITIALIZATION.
  " hier können z.B. dynamische Vorbelegungen vorgenommen werden

* Ereignis vor Anzeige des Selektionsbildschirms
AT SELECTION-SCREEN OUTPUT.
  " Parameter auf reine Anzeige setzen

* Ereignis bei Eingabeprüfung für Einzelfelder
AT SELECTION-SCREEN ON Feldname.

* Ereignis für F1-Hilfe bei einem Feld
AT SELECTION-SCREEN ON HELP-REQUEST FOR Feldname.
 " z.B. bei Druck auf Taste F1 in Eingabefeld

* Ereignis für F4-Hilfe bei einem Feld
AT SELECTION-SCREEN ON VALUE-REQUEST FOR Feldname.
  " z.B. bei Aufruf von File-Open-Dialogen o.ä.		

* Ereignis, wenn Benutzer die Funktionen "Zurück", "Beenden", Abbrechen" wählt
AT SELECTION-SCREEN ON EXIT-COMMAND.
 
* während der Abarbeitung des Selektionsbildschirms
AT SELECTION-SCREEN.
  " hier werden keine WRITE-Ausgaben prozessiert
  " hier zum Beispiel:
  "   AUTHORITY-CHECK ...
  "   MESSAGE ...

* Ereignis während Prozessierung des Selektionsbildes
START-OF-SELECTION.
  " WRITE wird erst am Ende der kompletten Abarbeitung des Ereignisses prozessiert

* Ereignis bei dem der Benutzer einen im Programm definierten Funktionscode auslöst
AT USER-COMMAND.
  " häufig für CASE ...
  " oder LOOP AT SCREEN INTO ...

* Ereignis zu dem der Benutzer den vordefinierten Funktionscode PICK (Mausklick) auslöst
AT LINE-SELECTION.
  " auf KLicks reagieren
  "   WRITE: / 'Verzweigungsliste Nr.: ', sy-lsind.
  "   WRITE: / 'Absolute Nummer der Zeile: ', sy-lilli.
  "   WRITE: / 'Inhalt der Zeile: ', sy-lisel.
  "   WRITE: / 'Row: ', sy-curow.
  "   WRITE: / 'Col: ', sy-cucol.

* Ereignisse während der Listenverarbeitung, wenn eine neue Seite begonnen wird
TOP-OF-PAGE.
  " und
TOP-OF-PAGE DURING LINE-SELECTION.
  " z.B. zur formatierten Ausgabe von Listenüberschriften
  "   WRITE: 'Nr.', 15 'NAME1', 25 'NAME2'.

[ABAP] Verwendung von Feldsymbolen (Zeiger)

* Zeilentyp
TYPES: BEGIN OF ty_data,
         name TYPE string,
         ort TYPE string,
       END   OF ty_data.

* Tabellentyp
TYPES: ty_it_itab TYPE STANDARD TABLE OF ty_data WITH DEFAULT KEY.

* Tabelle
DATA: it_itab TYPE ty_it_itab.

* Feldsymbol definieren
FIELD-SYMBOLS: <fs_line> TYPE ty_data.

* Beispielausgabe 1 mit Feldsymbol
LOOP AT itab ASSIGNING <fs_line>.
  WRITE: / <fs_line>-name, <fs_line>-ort.
ENDLOOP.

* Beispielausgabe 2 mit Inline-Feldsymbol
LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs_inline>).
  WRITE: / <fs_inline>-name, <fs_inline>-ort.
ENDLOOP.

[ABAP] Messages ausgeben

Messagetypen

Typ  Bezeichnung  Bedeutung

A    Abbruch      Anzeige der Nachricht in einem Dialogfenster. Die gesamte Transaktion wird nach der Bestätigung durch ENTER abgebrochen.
E    Error        Anzeige der Nachricht in der Statuszeile. Nach der Bestätigung durch ENTER wird der aktuelle Ereignisblock abgebrochen und die Anzeige der vorhergehenden Listenstufe bleibt bestehen. Während der Erstellung der Grundliste wird das gesamte Programm abgebrochen.
I    Information  Anzeige der Nachricht in einem Dialogfenster. Nach der Bestätigung durch ENTER wird die Verarbeitung hinter der MESSAGE-Anweisung wieder aufgenommen.
S    Status       Anzeige der Nachricht in der Statuszeile der momentan erstellten Liste.
W    Warnung      siehe E
X    Exit         Dieser Nachrichtentyp löst einen Laufzeitfehler aus und erzeugt einen Kurzdump.

Codebeispiele

* Beispiele
* Popup-Message des Typs 'E' (Fehler)
MESSAGE 'Nachricht.' TYPE 'I' DISPLAY LIKE 'E'.
* Popup-Message vom Typ 'I' (Information)
MESSAGE 'Text.' TYPE 'I'.

* Message in der Statuszeile vom Typ 'E' (rot)
MESSAGE 'Nachricht.' TYPE 'S' DISPLAY LIKE 'E'.
* Message in der Statuszeile vom Typ 'W' (gelb)
MESSAGE 'Nachricht.' TYPE 'S' DISPLAY LIKE 'W'.
* Message in der Statuszeile (grün)
MESSAGE 'Nachricht.' TYPE 'S'.

* Nachrichtentext Nr. 004 der Nachrichtenklasse 'mymessageclass', Typ 'I' (Information) mit Parameter v1
MESSAGE i004(mymessageclass) TYPE 'I' WITH v1.
* Nachrichtentext Nr. 004 der Nachrichtenklasse 'MYMESSAGECLASS' (Großschreibung!), Typ 'I' (Information)
MESSAGE ID 'MYMESSAGECLASS' TYPE 'I' NUMBER '004'.
* Fehlermessage komplett in der Statusleiste anzeigen
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 DISPLAY LIKE 'E'.
* Fehlermessage in String konvertieren
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO DATA(lv_message_str).
WRITE: / lv_message_str.

sy-msg in String

* Variante 1
DATA(lv_msg) = |{ sy-msgv1 } { sy-msgv2 } { sy-msgv3 } { sy-msgv4 }|.
WRITE: / lv_msg.

* Variante 2
DATA(lv_msg) = ||.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_msg.
WRITE: / lv_msg.

Weiterführender Link: Link

[ABAP] Objektorientiertes (OO) Exceptionhandling mit TRY … CATCH

Variante 1 (implizites Erzeugen von Objekten)

* DEMO_CATCH_EXCEPTION

START-OF-SELECTION.
  TRY.
      RAISE EXCEPTION TYPE cx_sy_zerodivide.
* Exception abfangen
    CATCH cx_sy_zerodivide INTO DATA(e_text).
      MESSAGE e_text->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
  ENDTRY.

Variante 2 (explizites Erzeugen von Objekten)

START-OF-SELECTION.
  TRY.
      DATA(excp) = NEW cx_os_object_not_found( classname = 'MYCLASS' ).
      RAISE EXCEPTION excp.
* Exception abfangen
    CATCH cx_os_object_not_found INTO DATA(e_text).
      MESSAGE e_text->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
  ENDTRY.

Variante 3 (explizites Erzeugen von Objekten – RE-RAISING)

START-OF-SELECTION.
  TRY.
      TRY.
          DATA(excp) = NEW cx_sy_file_open( filename = 'xyz.txt' ).
          RAISE EXCEPTION excp.
* Exception abfangen
        CATCH cx_root INTO DATA(exc).
* RE-RAISING einer neuen Exception
          RAISE EXCEPTION TYPE cx_sy_file_position
            EXPORTING
              previous = exc.
      ENDTRY.
* Exception abfangen
    CATCH cx_root INTO DATA(exc2).
      MESSAGE exc2->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
  ENDTRY.

Variante 4 (Runtime Exceptions)

START-OF-SELECTION.
  TRY.
* implizites Erzeugen von Exception cx_sy_zerodivide
      DATA(erg) = 1 / 0.
* Exception abfangen
    CATCH cx_root INTO DATA(e_text).
      MESSAGE e_text->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
  ENDTRY.

Variante 5 (Beispiel – Definition und Auslösen einer OO-Exception)

CLASS my_class DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS: my_method
* Exception propagieren
      RAISING cx_sy_zerodivide.
ENDCLASS.
 
CLASS my_class IMPLEMENTATION.
  METHOD my_method.
    ...
* Auslösen der Systemexception cx_sy_zerodivide
    RAISE EXCEPTION TYPE cx_sy_zerodivide.
    ...
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
* Behandlung einer OO-Exception
  TRY.
* Funktionsaufruf, der Exception cx_sy_zerodivide auslösen kann
      my_class=>my_method( ).
* Exception cx_sy_zerodivide abfangen
    CATCH cx_sy_zerodivide INTO DATA(e_text).
      MESSAGE e_text->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
  ENDTRY.

Weiterführende Information: Link und Link

[ABAP] Übersicht User-Commands

Code  Funktionstaste    Beschreibung

BACK  F3                Eine Stufe zurückgehen
ONLI  F8                Programmausführung läuft bei START-OF-SELECTION weiter
P--   Strg-Bild hoch    Zur ersten Fensterseite blättern
P-    Bild hoch         Zur vorigen Fensterseite blättern
P+    Bild runter       Zur nächsten Fensterseite blättern
P++   Strg-Bild runter  Zur letzten Fensterseite blättern
PICK  F2                Ereignis AT LINE-SELECTION
PRI   Strg-P            Angezeigte Liste drucken
RW    F12 , ESC         Bearbeitung Abbrechen
%CTX  Shift-F10         Kontextmenü auf Liste
%EX   Shift-F3          Bearbeitung beenden
%PC                     Liste in Datei sichern
%SC   Strg-F            Muster suchen
%SC+  Strg-G            Muster weiter suchen
%SL                     Liste in Office sichern
%ST                     Liste in Berichtsbaum sichern