[ABAP] Strings aufsplitten (analog zu PHP explode)

Variante 1 (beliebige Anzahl Splitelemente)

DATA: lv_satz TYPE string VALUE 'Horst;Udo;Heinz;Ede'.
DATA(it_elem) = VALUE stringtab( ).

SPLIT lv_satz AT ';' INTO TABLE it_elem.

Variante 2 (vordefinierte Anzahl Splitelemente)

DATA: lv_satz TYPE string VALUE 'abc,def,ghi'.
DATA: t11 TYPE string.
DATA: t22 TYPE string.
DATA: t33 TYPE string.
  
SPLIT satz AT ',' INTO t11 t22 t33.

WRITE: / t11, t22, t33.

[ABAP] Strings durchsuchen

DATA: f TYPE string VALUE 'TEST_TEST',
      g TYPE string VALUE 'ST',
      res TYPE match_result_tab.

FIELD-SYMBOLS <match> LIKE LINE OF res.

FIND ALL OCCURRENCES OF g IN f RESULTS res. " Zeichenfolge g in f suchen, Ergebnisausgabe in res

LOOP AT res ASSIGNING <match>. 
  WRITE: / 'offset: ', <match>-offset, 'length: ', <match>-length.
ENDLOOP.

IF sy-subrc EQ 0.
  ... " f enthält g
ENDIF.

[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] Parameter mit Auswahlbereich (SELECT-OPTIONS)

Variante 1 (DATA)

DATA: lv_matnr TYPE matnr.

* Parameterfeld von ... bis mit Dictionary-Type
SELECT-OPTIONS: so_matnr FOR lv_matnr DEFAULT '0000000001' TO '1000000000'.

START-OF-SELECTION.

* so_matnr ist eine itab mit Kopfzeile
  IF lines( so_matnr ) > 0.
* erstes Element der itab ausgeben
    WRITE: / so_matnr[ 1 ]-sign, so_matnr[ 1 ]-option, so_matnr[ 1 ]-low, so_matnr[ 1 ]-high.
  ENDIF.

Variante 2 (sy-datum)

* von 01.01.1999 bis Systemdatum
SELECT-OPTIONS: so_date FOR sy-datum DEFAULT '19990101' TO sy-datum.

START-OF-SELECTION.

* so_date ist eine itab mit Kopfzeile
  IF lines( so_date ) > 0.
* erstes Element der itab ausgeben
    WRITE: / so_date[ 1 ]-sign, so_date[ 1 ]-option, so_date[ 1 ]-low, so_date[ 1 ]-high.
  ENDIF.

Variante 3 (INITIALIZATION)

SELECT-OPTIONS: so_date FOR sy-datum.

INITIALIZATION.
* Initialwerte für so_date setzen
  so_date[] = VALUE #( ( sign   = 'I'
                         option = 'BT'
                         low    = sy-datum - 5
                         high   = sy-datum
                       )
                     ).

START-OF-SELECTION.
* so_date ist eine itab mit Kopfzeile
  IF lines( so_date ) > 0.
* erstes Element der itab ausgeben
    WRITE: / so_date[ 1 ]-sign, so_date[ 1 ]-option, so_date[ 1 ]-low, so_date[ 1 ]-high.
  ENDIF.

Variante 4 (TABLES)

* Zugriff Tabellenobjekt aus dem Dictionary deklarieren,
* automatische Verknüpfung der Suchilfe auch zu and. Objekten des Selektionsbildschirms
* obsolet (sollte nicht mehr verwendet werden)
TABLES: mara.

* Parameterfeld von ... bis mit Dictionary-Type
SELECT-OPTIONS: so_matnr FOR mara-matnr DEFAULT '0000000001' TO '1000000000'.

START-OF-SELECTION.

* so_matnr ist eine itab mit Kopfzeile
  IF lines( so_matnr ) > 0.
* erstes Element der itab ausgeben
    WRITE: / so_matnr[ 1 ]-sign, so_matnr[ 1 ]-option, so_matnr[ 1 ]-low, so_matnr[ 1 ]-high.
  ENDIF.

[ABAP] Einfacher Parameter (Labeled Edit)

PARAMETERS: p_mypar1 TYPE c LENGTH 2 DEFAULT 'AB'.        " einfacher Parameter mit Vorgabewert
PARAMETERS: p_mypar2 TYPE dicttype-var DEFAULT 'XY'.      " einfacher Parameter mit Dictionary-Type mit Suchhilfe, Langtext usw.
PARAMETERS: p_mypar3 TYPE string OBLIGATORY DEFAULT 'DE'. " einfacher Parameter mit Defaultwert und als Pflichteingabefeld
PARAMETERS: p_mypar4 TYPE i OBLIGATORY DEFAULT '1000'.

oder

PARAMETERS: p_mypar TYPE transparentetabelle-spalte DEFAULT 'XY'. " Spalte aus transparenter Tabelle (Dictionary Objekt) nutzen mit Suchhilfe, Langtext usw.

[ABAP] OpenSQL verwenden

Beispiel 1

DATA: it_tab TYPE itabtype,        " itab definieren
      ls_line LIKE LINE OF it_tab, " Zeile der itab definieren
      name TYPE string.

INITIALIZATION.
  name = 'test'.

* zwei Spalten aus Tabelle 'mytable' holen und in Datenelement 'ls_line' speichern
  SELECT spalte1, spalte2 FROM mytable INTO @ls_line WHERE spalte3 = @name.
    WRITE: / ls_line-element1.
    APPEND ls_line TO it_tab. " Zeile an itab anfügen
  ENDSELECT.

* Fehlerabfrage
  IF sy-subrc <> 0.
    RAISE EXCEPTION TYPE cx_list_error. " hier mal eine Systemexception werfen
  ELSE.
    ...
  ENDIF.

Beispiel 2

DATA: it_tab TYPE itabtype,        " itab definieren
      ls_line LIKE LINE OF it_tab, " Zeile der itab definieren
      name TYPE string.

INITIALIZATION.
  name = 'test'.

* zwei Spalten aus Tabelle 'mytable' holen und in itab 'it_tab' speichern
  SELECT spalte1, spalte2 FROM mytable INTO TABLE @it_tab WHERE spalte3 = @name.

* Fehlerabfrage
  IF sy-subrc <> 0.
    RAISE EXCEPTION TYPE cx_list_error. " hier mal eine Systemexception werfen
  ELSE.
* durch die Elemente der itab loopen
    LOOP AT it_tab INTO ls_line.
      WRITE: / ls_line-element1.
    ENDLOOP.
  ENDIF.

Weiterführende Infos: Link

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