[ABAP] Strings ersetzen

* Variante 1 (REPLACE, alle Vorkommen von '!' mit '.')
DATA: s TYPE string VALUE 'Test!'.
REPLACE ALL OCCURRENCES OF '!' IN s WITH '.'.
WRITE: / s.

* Variante 2 (replace, 1 Zeichen an der Stelle 4)
DATA(res) = replace( val = 'Test!' off = 4 len = 1 with = '.' ).
WRITE: / res.

* Variante 3 (replace, das erste Vorkommen von '-')
DATA(rep) = replace( val = '1-2' sub = '-' with = '+' ).
WRITE: / rep.

* Variante 4 (replace, alle Vorkommen von '*')
DATA(rep) = replace( val = '*test*' sub = '*' with = '%' occ = 0 ).
WRITE: / rep.

[ABAP] Nachrichtenklassen pflegen

Nachrichtenklasse anlegen

  • SE91 (Nachrichtenpflege)

oder

  • SE80 (Object Navigator)->Paket->Rechtsklick->Anlegen->Weitere (1)->Nachrichtenklasse

oder

  • im Code auf den neu eingegebenen Klassennamen hinter ‘MESSAGE …’ doppelklicken

danach

  • in der Tabelle die Kurztexte (000…) zur Nachrichtenklasse editieren
  • Es können max. 4 Platzhalter ‘&’ oder explizit ‘&1’, ‘&2’, ‘&3’, ‘&4’ eingefügt werden, die später beim Aufruf des Textes mit Variablenwerten gefüllt werden können.
  • evtl. Haken bei ‘Selbserklärend’ setzen
  • evtl. Langtext über Button ‘Langtext’ pflegen
  • Button “Sichern” (Diskette) und “Aktivieren” (Streichholz) nicht vergessen

[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

[ABAB] Struct (Datentyp) definieren

Einfaches Beispiel

* Definition
TYPES: BEGIN OF s_adresse,
         knr(8)  TYPE n,
         name    TYPE string,
         vorname TYPE string,
         plz(5)  TYPE n,
         ort     TYPE string,
       END OF s_adresse.

* Variable vom Typ
DATA: adresse TYPE s_adresse.

* Zugriff
adresse-knr = '1234'.
adresse-name = 'Hoffmann'.
adresse-vorname = 'Horst'.
adresse-plz = '01069'.
adresse-ort = 'Dresden'.

* Ausgabe
WRITE:  / adresse-knr,
        / adresse-name,
        / adresse-vorname,
        / adresse-plz,
        / adresse-ort.

Verschachtelung von Structen

TYPES: BEGIN OF s_type1,
         num TYPE i,
         name TYPE string,
       END OF s_type1.

TYPES: BEGIN OF s_type2,
         col TYPE i,
         text TYPE string,
       END OF s_type2.

TYPES: BEGIN OF s_mystruct,
         a TYPE s_type1,
         b TYPE s_type2,
       END OF s_mystruct.

[ABAP] Exceptionhandling (obsolet)

Folgende Sprachelemente sollten nicht mehr angewendet werden, da sie mittlerweile obsolet sind:

Definition und Auslösen einer Exception

* Definition und Auslösen einer Exception
CLASS my_class DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS my_method
       IMPORTING var1 TYPE i
       EXCEPTIONS my_exception.
ENDCLASS.

* Auslösen einer Exception
CLASS my_class IMPLEMENTATION.
  METHOD my_method.
    ...
    RAISE my_exception.
    ...
  ENDMETHOD.
ENDCLASS.

Behandlung einer Exception

my_class=>my_method( EXPORTING var1 = 1
                     EXCEPTIONS my_exception = 1 ).
* Exception über sy-subrc abfragen
IF sy-subrc <> 0.
  MESSAGE 'Fehler.' TYPE 'I'.
ENDIF.

[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] Variablendeklaration

DATA zahl TYPE i.                         " ganze Zahl (int)
DATA zahl TYPE i VALUE '1'.               " ganze Zahl (int) mit vordefiniertem Wert '1'
DATA chk TYPE c LENGTH 1 VALUE 'X'.       " char Länge 1 Vorbelegung mit Wert 'X'
DATA preis TYPE p DECIMALS 2 VALUE '1.3'. " gepackte Gleitkommazahl, zwei Nachkommastellen, Wert '1.3'
DATA zk(5) TYPE c.                        " char Länge 5 (obsolet)

TYPES zk TYPE c LENGTH 5.                 " Typdef zk vom Typ char Länge 5
DATA text TYPE zk.                        " text vom Typ zk

DATA: dt TYPE sy-datum,                   " verkettete Anweisung mit Komma getrennt
      zt TYPE sy-uzeit.                   " Nutzung von Systemdatentypen

Links

[ABAP] Datentypen

In ABAP wird unterschieden zwischen:

  • eingebauten (elementaren) ABAP-Typen, die wiederum in
    • vollständige Datentypen (parameterlos) -> d, t, i, f, string, xstring
    • unvollständige Datentypen (mit Parametern) -> c, n, p, x

    unterschieden werden

  • programmlokale (per TYPES definierte) Datentypen
  • externe (globale) Datentypen (Abbildung auf ABAP-Datentypen) im ABAP Dictionary
    • Datenelement
    • Strukturtyp
    • interne Tabellen
  • komplexe Datentypen (Strukturen, Tabellen)
  • Referenztypen (Daten, Objekte)