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

Nützliche Tutorial-Seiten zum Thema SAP / ABAP

ABAP – Schlüsselwortdokumentation

  • Syntax und Bedeutung der Schlüsselwörter der Sprache ABAP und ABAP Objects (benötigt etwas Zeit beim Laden)

ABAP – Releaseabhängige Änderungen

  • ABAP – Releaseabhängige Änderungen

Tastenkombinationen im SAP

  • Auflistung von gängigen SAP-Tastenkombinationen

OK-Code-Zeile im SAP

  • Infos zu OK-Code-Zeile

SAP ABAP Tables

  • The Best Online document for SAP ABAP Tables

Online SAP Datasheet

  • SAP Objekte und Transaktionen

Tricktresor

  • Tipps und Tricks zu SAP

SAP Brains

  • SAP Online Tutorials zu vielen Themen

ABAP Mentor

  • SAP / ABAP Artikel zu vielen Themen

ABAP/4 How-To Compendium (Matthias König)

  • ABAP How-Tos

ABAPforum

  • ABAP Forum

Zevolving

  • Code Snippets und Tutorials

Patrik Weber

  • Kollaborieren statt Kollabieren

Denis Reis

  • ABAP Snippets und Tutorials

Łukasz Pęgiel

  • ABAP Snippets und Tutorials

Sandip Roy

  • ABAP Snippets und Tutorials

Stacknoise

  • SAP Technical Blog

Martin Maruskin blog

  • SAP Technical Blog

SAP4Tech

  • SAP and ABAP Free Tutorials

Infodepot

  • SAP ABAP samples

Reposrc (Wartungsmodus)

  • SAP ABAP Sourcen

Spider’s web

  • SAP Tipps

ZAP Yard

  • SAP technical tips and solutions

Techsap

  • SAP Tipps

SAPCODES

  • SAP Tipps & Tutorials

ABAP Developer Network

  • SAP Tipps & Tutorials

SAP ABAP Central

  • SAP Tipps & Tutorials

Techhippo

  • Tutorials zu SAPUI5, OData, Web IDE

thinkdoforward.com

  • Für SAP-Berater

stschnell.de

  • Entwicklung und Tools für ABAP, Powershell, Basic

archer4sap.com

  • Developer Blog

In My IT knowledge

  • Developer Blog

HavliCzech

  • Developer Blog

LearnSapAbap

  • Developer Blog

ABAPQuest – SAP ABAP Tips and Tricks

  • Developer Blog

MattWiki

  • Developer Blog

SAP-Tips

  • Developer Blog

samplecodeabap.com

  • Experiments with ABAP

kodyaz.com

  • SAP ABAP Programming and HANA Database Tutorials

saptechnicalguru.com

  • Blog for SAP technical guru’s: SAP basis, SAP authorization, SAP ABAP

Passionate about SAP – A Blog

  • ABAP-Blog

Die Sapotheke

  • Tipps und Tricks im Umgang mit SAP® (ERP)

SAPManDoo

  • SAP Resource

Learn Tips

  • SAP Resource

ABAP CookBook

  • Large collection of free premium ABAP tutorials

SAP Stack

  • SAP Resource

Doktor ERP

  • SAP Resource

SAPUI5 Tutorials

  • SAPUI5 Resource

SAP Tutorials

  • SAP Resource

Learntips

  • SAP Source for Tutorials, Tips, Tricks

ABAP Weekly

  • ABAP Weekly – The best ABAP Development links, every Friday

SAP Developer Workbench

  • The best resource for SAP and ABAP Knowhow

SAP Community Wiki

  • Code Gallery (Snippets)

Nocin.eu

  • Homelab, Linux, ABAP

sap123.com

  • Resources for SAP Consultants

wiki.scn.sap.com

  • ABAP Development