[ABAP] Interne Tabellen: Speicherung und Suche von Key-Value-Paaren mit Hilfe von tiefen Strukturen

* Typ für Eingabedaten (Key)
TYPES: BEGIN OF ty_in,
         key1 TYPE string,
         key2 TYPE string,
       END OF ty_in.

* Typ für Ausgabedaten (Value)
TYPES: BEGIN OF ty_out,
         vorname  TYPE string,
         nachname TYPE string,
       END OF ty_out.

* Zusammengesetzte Tabellenzeile (tiefe Struktur) für Key-Value-Paare
TYPES: BEGIN OF ty_s_line,
         in  TYPE ty_in,
         out TYPE ty_out,
       END OF ty_s_line.

* Tabellentyp für Speicherung von Key-Value-Paaren
TYPES: ty_it_data TYPE HASHED TABLE OF ty_s_line WITH UNIQUE KEY in-key1 in-key2.

* Testdaten
DATA(it_data) = VALUE ty_it_data( ( in-key1 = 'A1' in-key2 = 'A2' out-vorname = 'Hans'     out-nachname = 'Müller' )
                                  ( in-key1 = 'B1' in-key2 = 'B2' out-vorname = 'Ida'      out-nachname = 'Schulze' )
                                  ( in-key1 = 'C1' in-key2 = 'C2' out-vorname = 'Heinz'    out-nachname = 'Lehmann' )
                                  ( in-key1 = 'D1' in-key2 = 'D2' out-vorname = 'Marianne' out-nachname = 'Meier' )
                                ).

* Struktur mit Suchkriterium
DATA(lv_in) = VALUE ty_in( key1 = 'A1' key2 = 'A2' ).
* Rückgabestruktur
DATA(lv_out) = VALUE ty_out( ).

* Übergabe der Struktur mit den Key-Werten
IF line_exists( it_data[ in = lv_in ] ).
* wenn Key gefunden, dann Rückgabestruktur übergeben
  lv_out = it_data[ in = lv_in ]-out.
* Datenausgabe
  cl_demo_output=>display( lv_out ).
ELSE.
  WRITE: / 'Nichts gefunden.'.
ENDIF.

[ABAP] ABAP Encoding / Codepage

Übersicht

* Typgruppe ABAP
* Typ: ABAP_ENCOD
* Tabelle: TCP00A

Codepage  Encoding
---------------------
1100      iso-8859-1
1101      ascii
1105      us-ascii (7 bits)
1160      windows-1252
1401      iso-8859-2
4102      utf-16be
4103      utf-16le
4110      utf-8

Links

[ABAP] SELECT-OPTIONS Auswahldialog anzeigen

Variante 1 (RANGE)

DATA: rg_matnr TYPE RANGE OF matnr.

CALL FUNCTION 'COMPLEX_SELECTIONS_DIALOG'
  EXPORTING
    title             = 'Auswahl'
    text              = 'Materialnummern'
  TABLES
    range             = rg_matnr
  EXCEPTIONS
    no_range_tab      = 1
    cancelled         = 2
    internal_error    = 3
    invalid_fieldname = 4
    OTHERS            = 5.

IF sy-subrc = 0.
  cl_demo_output=>display( rg_matnr ).
ENDIF.

Variante 2 (RSTABFIELD)

DATA(lv_tab_field) = VALUE rstabfield( tablename = 'CSKS' fieldname = 'KOSTL' ).

DATA: rg_test TYPE RANGE OF csks-kostl.

CALL FUNCTION 'COMPLEX_SELECTIONS_DIALOG'
  EXPORTING
    title             = 'Auswahl'
    text              = 'Kostenstelle'
    tab_and_field     = lv_tab_field
    help_field        = 'CSKS-KOSTL'
  TABLES
    range             = rg_test
  EXCEPTIONS
    no_range_tab      = 1
    cancelled         = 2
    internal_error    = 3
    invalid_fieldname = 4
    OTHERS            = 5.

IF sy-subrc = 0.
  cl_demo_output=>display( rg_test ).
ENDIF.

[ABAP] RegEx: Submatches in einem String finden

Variante 1 (cl_abap_matcher)

* mehrere Submatches in einer vorgegebenen Ordnerstruktur finden
* Unterordner mit '/<Zahlen>'
DATA(matcher) = cl_abap_matcher=>create( pattern     = '/([0-9]{1,5})'
                                         text        = '/category/12345/item/12'
                                         ignore_case = abap_true ).

WHILE abap_true = matcher->find_next( ).
  WRITE: / matcher->get_submatch( 1 ).
ENDWHILE.

Variante 2 (cl_abap_matcher)

* mehrere Submatches in einer vorgegebenen Ordnerstruktur finden
* Ordnerstruktur mit '/category/<Zahlen>/item/<Zahlen>'
DATA(matcher) = cl_abap_matcher=>create( pattern     = '^/category/([0-9]{1,5})/item/([0-9]{1,2})$'
                                         text        = '/category/12345/item/12'
                                         ignore_case = abap_true ).

IF abap_true = matcher->match( ).
* erstes Match
  WRITE: / matcher->get_submatch( 1 ).
* zweites Match
  WRITE: / matcher->get_submatch( 2 ).
ENDIF.

Variante 3 (FIND ALL OCCURRENCES OF REGEX)

* Ordnerstruktur mit '/category/<Zahlen>/item/<Zahlen>'
DATA(lv_regex) = '^/category/([0-9]{1,5})/item/([0-9]{1,2})$'.
DATA(lv_text) = '/category/12345/item/12'.

* Alle Auftreten des Suchmusters
FIND ALL OCCURRENCES OF REGEX lv_regex IN lv_text RESULTS DATA(it_results).

* Ausgabe
LOOP AT it_results ASSIGNING FIELD-SYMBOL(<r>).
  LOOP AT <r>-submatches ASSIGNING FIELD-SYMBOL(<s>).
    WRITE: / substring( val = lv_text off = <s>-offset len = <s>-length ).
  ENDLOOP.
ENDLOOP.

Variante 4 (FIND REGEX)

DATA(lv_regex) = '^/category/([0-9]{1,5})/item/([0-9]{1,2})$'.
DATA(lv_text) = '/category/12345/item/12'.

* Erstes Auftreten des Suchmusters
FIND REGEX lv_regex IN lv_text RESULTS DATA(lv_results).

LOOP AT lv_results-submatches ASSIGNING FIELD-SYMBOL(<s>).
  WRITE: / substring( val = lv_text off = <s>-offset len = <s>-length ).
ENDLOOP.

[ABAP] RegEx: Bestimmte Nodes (Submatches) in einem XML-String finden

* XML
DATA(lv_xml) = |<person>| &&
               |  <name>Udo</name>| &&
               |  <age>25</age>| &&
               |</person>| &&
               |<person>| &&
               |  <name>Ede</name>| &&
               |  <age>34</age>| &&
               |</person>| &&
               |<person>| &&
               |  <name />| &&
               |  <age>78</age>| &&
               |</person>|.

* Alle Nodes mit <name>...</name> finden
DATA(matcher) = cl_abap_matcher=>create( pattern     = '<name>([[:alnum:]]*)</name>'
                                         text        = lv_xml
                                         ignore_case = abap_true ).

* Alle Suchergebnisse ausgeben
WHILE abap_true = matcher->find_next( ).
  WRITE: / matcher->get_submatch( 1 ).
ENDWHILE.