This is a test message to test the length of the message box.
Login
ABAP XCO Strings
Erstellt von Software-Heroes

ABAP - XCO Strings

99

In diesem Artikel schauen wir uns die XCO Klasse zur Erzeugung und Verarbeitung von Strings für ABAP Cloud an und vergleichen sie mit den klassischen Statements.

Werbung


Die XCO Klassen sind Hilfsklassen die verschiedene Funktionen des Alltags gebündelt unter einer öffentlichen API zur Verfügung stellen. Weitere Informationen und eine Übersicht über die XCO Bibliotheken findest du auf der Übersichtsseite.

 

Einleitung

In diesem Artikel schauen wir uns die Sammlung der String Funktionen an und wie du sie nutzen kannst. Dazu gibt es verschiedene String Objekte, die du aus der Basis XCO_CP erhalten kannst. In den folgenden Abschnitten gehen wir auf die verschiedenen Objekte ein und schauen uns die Unterschiede zu Klassisch, Modern und XCO an.

 

STRING

Über XCO_CP=>STRING erhalten wir ein String Objekt, mit dem wir einen einzelnen String verarbeiten können. Im Interface IF_XCO_STRING findest du die entsprechenden Methoden für die Verwendung und in der Klasse CL_XCO_STRING die Implementierung.

 

Lower/Upper

Für die Konvertierung Richtung Lower und Upper Case eines Strings, gibt es jeweils ähnliche Methoden in allen drei Versionen. Dazu ein Beispiel für die Großkonvertierung.

" Classic
TRANSLATE ld_string TO UPPER CASE.

" Modern
ld_string = to_upper( c_string ).

" XCO
ld_string = xco_cp=>string( c_string )->to_upper_case( )->value.

 

Substring

Die Ermittlung eines Teilstrings aus einem Text wir normalerweise Substring genannt. Dazu stehen dir unterschiedliche Befehle und Methoden in ABAP zur Verfügung.

" Classic
ld_string = c_string+11(3).

" Modern
ld_string = substring( val = c_string off = 11 len = 3 ).

" XCO
ld_string = xco_cp=>string( c_string )->from( 12 )->to( 3 )->value.

 

Wie dir sicherlich aufgefallen ist, arbeitet die XCO Klasse hier etwas anders. Mit FROM extrahieren wir den Substring von unserer Zeichenkette ab dem 12 Zeichen bis zum Ende. Im nächsten Schritt extrahieren wir den neuen Teilstring bis zum dritten Zeichen.

 

Split

Du möchtest einen String an einem Trennzeichen teilen und dabei eine flexible Menge an neuen Strings erhalten? Dafür wird der SPLIT Befehl in ABAP verwendet. Dieser besitzt keine moderne Version, sondern nur die klassische Version.

" Classic
SPLIT c_string AT c_seperator INTO TABLE DATA(lt_parts).

" Modern

" XCO
lt_parts = xco_cp=>string( c_string )->split( c_seperator )->value.

 

Anhängen

Um etwas an den Anfang (PREPEND) oder am Ende (APPEND) eines Strings anzuhängen, gibt es verschiedene Varianten in ABAP.

" Classic
CONCATENATE c_string c_part INTO ld_string.

" Modern
ld_string = c_string && c_part.

" XCO
ld_string = xco_cp=>string( c_string )->append( c_part )->value.

 

Teil prüfen

Du möchtest den Anfang (STARTS_WITH) oder das Ende (ENDS_WITH) eines Strings überprüfen gegen eine Zeichenkette, da musst du in den meisten Fällen schon etwas mehr Code implementieren. Hier lohnt sich ein Blick auf die Methoden der XCO Klasse.

" Classic
DATA(ld_start) = strlen( c_string ) - strlen( c_point ) - 1.
DATA(ld_length) = strlen( c_point ).

IF c_string+ld_start(ld_length) = c_point.
ENDIF.

" Modern
IF substring( val = c_string
              off = strlen( c_string ) - strlen( c_point ) - 1
              len = strlen( c_point ) ) = c_point.
ENDIF.

" XCO
IF xco_cp=>string( c_string )->ends_with( c_point ).
ENDIF.

 

Regulärer Ausdruck

Für die Verwendung von regulären Ausdrücken gibt es zwei Methoden. Mit der Methode MATCHES kannst du deinen String gegen einen regulären Ausdruck abgleichen. Mit der Methode GREP, kannst du dir alle Teile zurückgeben lassen, die dem Suchpattern entsprechen.

" Classic
FIND ALL OCCURRENCES OF PCRE c_regex IN c_string RESULTS DATA(lt_found).
LOOP AT lt_found INTO DATA(ls_found).
  INSERT c_string+ls_found-offset(ls_found-length) INTO TABLE lt_parts.
ENDLOOP.

CLEAR lt_parts.

" Modern
ld_start = 0.
DO.
  DATA(ld_position) = find( val  = c_string
                            pcre = c_regex
                            off  = ld_start ).
  IF ld_position = -1.
    EXIT.
  ENDIF.

  DATA(ld_to) = find_end( val  = c_string
                          pcre = c_regex
                          off  = ld_start ).

  INSERT substring( val = c_string
                    off = ld_position
                    len = ld_to - ld_position ) INTO TABLE lt_parts.
  ld_start = ld_to.
ENDDO.

" XCO
lt_parts = xco_cp=>string( c_string )->grep( iv_regular_expression = c_regex
                                             io_engine             = xco_cp_regular_expression=>engine->pcre( )
                            )->value.

 

Hinweis: Aktuell scheint GREP nicht mit dem gleichen regulären Ausdruck zu funktionieren, hier sind wir aktuell in Abstimmung.

 

Zerlegen

Für den speziellen Ausdruck der Methode DECOMPOSE möchten wir nur die Verwendung aufführen, da das Auflösen des Strings anhand der Groß- und Kleinschreibung einiges an Logik benötigt. Der Methode kannst du noch verschiedene Verfahren mitgeben (PascalCase und camelCase). Nach der Zerlegung erhalten wir eine Tabelle mit vier Einträgen.

lt_parts = xco_cp=>string( `MyNameIsPascal` )->decompose( xco_cp_string=>decomposition->pascal_case )->value.

 

Das Gegenstück findest du in der STRINGS Klasse mit der Methode COMPOSE, um dann die einzelnen Bestandteile wieder nach Logik zu verknüpfen.

 

Konvertieren

Bei der Konvertierung von String nach XString gibt es aktuell verschiedene Funktionsbausteine, Klassen und andere Möglichkeiten. Mit der Methode AS_XSTRING erhältst du die Möglichkeit, den String mit der richtigen Codepage zu konvertieren.

" Classic
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
  EXPORTING
    text   = c_string
  IMPORTING
    buffer = ld_xstring
  EXCEPTIONS
    failed = 1
    OTHERS = 2.
IF sy-subrc <> 0.
ENDIF.

" Modern
ld_xstring = cl_abap_codepage=>convert_to( source = c_string ).

" XCO
ld_xstring = xco_cp=>string( c_string )->as_xstring( xco_cp_character=>code_page->utf_8 )->value.

 

Meldung

Möchtest du einen String als Meldung ausgeben, musst du ein entsprechendes Mapping vornehmen, um die Nachrichtenfelder zu befüllen. Mit der Methode AS_MESSAGE, kannst du aus dem Text ein Nachrichtenklasse erzeugen und diese weiterverwenden. So kannst du dir die Nachricht als Struktur SYMSG zurückgeben lassen. Dazu musst du nur auf VALUE des Objekts zurückgreifen.

DATA(ls_message) = xco_cp=>string( c_long_string )->as_message( xco_cp_message=>type->error )->value.

 

Schauen wir uns dann die Struktur von LS_MESSAGE an, erhalten wir den richtigen Typ für die Meldung, eine Meldungsklasse mit Platzhaltern und das Mapping des Strings.

 

Als zweites Beispiel können wir auch eine Ausnahmeklasse erzeugen und die Meldung in der Klasse überschreiben lassen.

DATA(lo_message) = NEW cx_abap_context_info_error( ).
xco_cp=>string( c_long_string )->as_message( )->write_to_t100_dyn_msg( lo_message ).

 

Das Ergebnis können wir uns nun im "ABAP Exception (Debugger)" View anschauen und validieren.

 

STRINGS

Über XCO_CP=>STRINGS erhalten wir ein String Objekt, mit dem wir eine Tabelle von Strings bearbeiten können. Verwenden wir in der String Klasse die SPLIT Methode, erhalten wir zum Beispiel so ein Objekt. Im Interface IF_XCO_STRINGS findest du die entsprechenden Methoden für die Verwendung und in der Klasse CL_XCO_STRINGS die Implementierung.

 

GET

Du möchtest eine Zeile aus der String Tabelle lesen? Mit der GET Methode kannst du dies tun, um ein STRING Objekt zu erhalten und damit weiterzuarbeiten oder den Inhalt zu lesen.

" Classic
READ TABLE lt_strings INDEX 5 INTO ld_string.

" Modern
ld_string = lt_strings[ 5 ].

" XCO
ld_string = xco_cp=>strings( lt_strings )->get( 5 )->value.

 

Hinweis: In den beiden letzten Fällen musst du dich um die Behandlung der Ausnahme CX_SY_ITAB_LINE_NOT_FOUND kümmern. Sollte die Zeile nicht existieren, so wird die Ausnahme ausgelöst.

 

Bereich

Mit den Methoden FROM und TO, kannst du einen Bereich aus einer Tabelle lesen und so Teile extrahieren. In dem Beispiel wollen wir einen Bereich aus der Mitte extrahieren.

" Classic
LOOP AT lt_strings INTO ld_string.
  IF sy-tabix >= 2 AND sy-tabix <= 3.
    APPEND ld_string TO lt_parts.
  ENDIF.
ENDLOOP.

" Modern
LOOP AT lt_strings INTO ld_string FROM 2 TO 3.
  INSERT ld_string INTO TABLE lt_parts.
ENDLOOP.

" XCO
lt_parts = xco_cp=>strings( lt_strings )->from( 2 )->to( 2 )->value.

 

Die Methode FROM, geht von dem TABIX 2 aus und liest die Sätze bis zum Ende. Die Methode TO nimmt dann das Ergebnis und liest von 1 bis 2, dieses Ergebnis erhalten wir dann in Parts. In dem Beispiel haben wir die Fehlerbehandlung weggelassen, da die XCO Klasse auch die Ranges überprüft, ob genügend Zeilen vorhanden sind.

 

Zusammenführen

Die COMPOSE Methode führt eine Tabelle von Strings nach gewissen Regeln zusammen und ist das Gegenstück zur DECOMPOSE Methode der String Klasse. Da die Logik etwas einfacher dafür ist, hier ein Beispiel.

" Classic
LOOP AT lt_strings INTO ld_string.
  DATA(ld_field) = ld_string+0(1).
  TRANSLATE ld_field TO UPPER CASE.
  CONCATENATE ld_result ld_field ld_string+1 INTO ld_result.
ENDLOOP.

" Modern
LOOP AT lt_strings INTO ld_string.
  ld_result &&= to_upper( substring( val = ld_string
                                     len = 1 ) ) && substring( val = ld_string
                                                               off = 1 ).
ENDLOOP.

" XCO
ld_result = xco_cp=>strings( lt_strings )->compose( xco_cp_string=>composition->pascal_case )->value.

 

Sortierung

Bevor wir unsere Tabelle neu sortieren, benötigen wir die neue Reihenfolge. Dazu legen wir eine Indextabelle an mit den neuen Zeilen und der Reihenfolge.

DATA(lt_index) = VALUE  if_xco_strings=>tt_indices( ( 3 ) ( 4 ) ( 5 ) ( 2 ) ( 1 ) ).

 

Dann können wir die eigentliche Logik durchführen, um unsere neue Ausgabetabelle zu erzeugen. Dazu verwenden wir die Methode REORDER der Klasse.

" Classic
LOOP AT lt_index INTO ld_index.
  READ TABLE lt_strings INTO ld_string INDEX ld_index.
  APPEND ld_string TO lt_parts.
ENDLOOP.

CLEAR lt_parts.

" Modern
LOOP AT lt_index INTO ld_index.
  INSERT lt_strings[ ld_index ] INTO TABLE lt_parts.
ENDLOOP.

" XCO
lt_parts = xco_cp=>strings( lt_strings )->reorder( lt_index )->value.

 

Hinweis: In der Logik fehlt noch die Fehlerbehandlung, dann wäre der Code etwas länger. Die Logik der XCO Klasse prüft außerdem, dass keine Zeilen verloren gehen.

 

Umdrehen

Bei der Methode REVERSE wir die komplette Tabelle einmal umgedreht, sodass der letzte Satz der erste Satz wird. Dazu die folgenden Beispiele, die ebenfalls nicht sehr komplex sind.

" Classic
LOOP AT lt_strings INTO ld_string.
  INSERT ld_string INTO lt_parts INDEX 1.
ENDLOOP.

" Modern
LOOP AT lt_strings INTO ld_string STEP -1.
  INSERT ld_string INTO TABLE lt_parts.
ENDLOOP.

" XCO
lt_parts = xco_cp=>strings( lt_strings )->reverse( )->value.

 

XSTRING

Über XCO_CP=>XSTRING erhalten wir ein Objekt zur Behandlung von XStrings im System. Im Interface IF_XCO_XSTRING findest du die entsprechenden Methoden für die Verwendung und in der Klasse CL_XCO_XSTRING die Implementierung.

 

Konvertierung

Aktuell gibt es nur eine Methode zur Konvertierung von XString zu String mit einer entsprechenden Konvertierung. Ein Beispiel könnte also wie folgt aussehen.

" Classic
CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
  EXPORTING
    im_xstring = c_xstring
  IMPORTING
    ex_string  = ld_string.

" Modern
ld_string = cl_abap_codepage=>convert_from( source = c_xstring ).

" XCO
ld_string = xco_cp=>xstring( c_xstring )->as_string( xco_cp_character=>code_page->utf_8 )->value.

 

Performance

Wie sieht es eigentlich mit der Performance von Standard Statements aus, wenn wir die XCO Klassen verwenden. Dazu machen wir einen einfachen Test mit dem SPLIT in ABAP. In unserem Testversucht, erzeugen wir eine Tabelle von zufälligen Strings und verarbeiten diese Zeile für Zeile. indem wir die Texte wieder zerlegen. Dazu erzeugen wir zuerst eine Tabelle von zufälligen Strings.

DATA(lt_parts) = VALUE string_table( ( `Apple` )
                                     ( `Banana` )
                                     ( `Mango` )
                                     ( `Kiwi` )
                                     ( `Ananas` )
                                     ( `Orange` )
                                     ( `Citron` )
                                     ( `Lime` )
                                     ( `Cherry` )
                                     ( `Apricot` )
                                     ( `Plum` )
                                     ( `Pear` )
                                     ( `Blueberry` )
                                     ( `Grapes` )
                                     ( `Salmonberry` )
                                     ( `Raspberry` )
                                     ( `Honeydew` ) ).

DATA(lo_rand_strings) = NEW zcl_bs_demo_random( id_min = 1
                                                id_max = lines( lt_parts ) ).
DATA(lo_rand_parts) = NEW zcl_bs_demo_random( id_min = 5
                                              id_max = 10 ).

DO id_lines TIMES.
  INSERT INITIAL LINE INTO TABLE rt_result REFERENCE INTO DATA(lr_line).

  DO lo_rand_parts->rand( ) TIMES.
    lr_line->* &&= | { lt_parts[ lo_rand_strings->rand( ) ] }|.
  ENDDO.
ENDDO.

 

Im nächsten Schritt führen wir die Logik mit dem klassischen Split aus und zerlegen den String in seine Bestandteile.

LOOP AT lt_strings REFERENCE INTO lr_string.
  SPLIT lr_string->* AT c_seperator INTO TABLE lt_split.
ENDLOOP.

 

Im zweiten Schritt verwenden wir die SPLIT Methode der XCO Klasse, um an die verschiedenen Bestandteile zu kommen.

LOOP AT lt_strings REFERENCE INTO lr_string.
  lt_split = xco_cp=>string( lr_string->* )->split( c_seperator )->value.
ENDLOOP.

 

Im ersten Schritt nehmen wir 5000 zufällige Zeilen und zerlegen die Tabelle Zeile für Zeile. Schauen wir uns die Laufzeit für die beiden Varianten an, dann fällt der Unterschied ins Auge. Die Verwaltung des Speichers für die Klassen und Instanzen ist knapp 5 bis 6 Mal so teuer, wie die einfache Verwendung des Statements.

 

Sollte dir die Performance an dieser Stelle nicht so wichtig sein, kannst du auch mit der XCO Klasse arbeiten, vor allem wenn noch weitere String Operationen mit den Daten geplant sind.

 

Vollständiges Beispiel

Hier findest du die gezeigten Beispiele in einer ausführbaren Klasse zum Testen und Debuggen. Für den Performancetest verwenden wir zwei Klassen, die nicht im Beispiel aufgeführt sind. Weitere Informationen findest du im GitHub Repository.

CLASS zcl_bs_demo_xco_string DEFINITION
  PUBLIC FINAL
  CREATE PUBLIC.

  PUBLIC SECTION.
    INTERFACES if_oo_adt_classrun.

  PRIVATE SECTION.
    CONSTANTS c_string      TYPE string  VALUE `This is my new string class.`.
    CONSTANTS c_long_string TYPE string  VALUE `If you want to have a longer string for validation and to test, you have to create it for youself.`.
    CONSTANTS c_xstring     TYPE xstring VALUE `54686973206973206D79206E657720737472696E6720636C6173732E`.
    CONSTANTS c_part        TYPE string  VALUE `ABAP`.
    CONSTANTS c_point       TYPE string  VALUE `.`.
    CONSTANTS c_seperator   TYPE string  VALUE ` `.
    CONSTANTS c_regex       TYPE string  VALUE `w*isw*`.

    METHODS split_performance
      IMPORTING io_out TYPE REF TO if_oo_adt_classrun_out.

    METHODS get_random_strings
      IMPORTING id_lines         TYPE i
      RETURNING VALUE(rt_result) TYPE string_table.

    METHODS operations_with_string
      IMPORTING io_out TYPE REF TO if_oo_adt_classrun_out.

    METHODS operations_with_strings
      IMPORTING io_out TYPE REF TO if_oo_adt_classrun_out.

    METHODS operations_with_xstring
      IMPORTING io_out TYPE REF TO if_oo_adt_classrun_out.
ENDCLASS.


CLASS zcl_bs_demo_xco_string IMPLEMENTATION.
  METHOD if_oo_adt_classrun~main.
    operations_with_string( out ).
    operations_with_strings( out ).
    operations_with_xstring( out ).
    split_performance( out ).
  ENDMETHOD.


  METHOD operations_with_string.
    DATA ld_xstring TYPE xstring.
    DATA(ld_string) = c_string.

    " Classic
    TRANSLATE ld_string TO UPPER CASE.

    " Modern
    ld_string = to_upper( c_string ).

    " XCO
    ld_string = xco_cp=>string( c_string )->to_upper_case( )->value.

    " Classic
    ld_string = c_string.
    TRANSLATE ld_string TO LOWER CASE.

    " Modern
    ld_string = to_lower( c_string ).

    " XCO
    ld_string = xco_cp=>string( c_string )->to_lower_case( )->value.

    " Classic
    ld_string = c_string+11(3).

    " Modern
    ld_string = substring( val = c_string
                           off = 11
                           len = 3 ).

    " XCO
    ld_string = xco_cp=>string( c_string )->from( 11 + 1 )->to( 3 )->value.

    " Classic
    " TODO: variable is assigned but never used (ABAP cleaner)
    SPLIT c_string AT c_seperator INTO TABLE DATA(lt_parts).

    " Modern

    " XCO
    lt_parts = xco_cp=>string( c_string )->split( c_seperator )->value.

    " Classic
    CONCATENATE c_string c_part INTO ld_string.

    " Modern
    ld_string = c_string && c_part.

    " XCO
    ld_string = xco_cp=>string( c_string )->append( c_part )->value.

    " Classic
    DATA(ld_start) = strlen( c_string ) - strlen( c_point ) - 1.
    DATA(ld_length) = strlen( c_point ).

    IF c_string+ld_start(ld_length) = c_point.
    ENDIF.

    " Modern
    IF substring( val = c_string
                  off = strlen( c_string ) - strlen( c_point ) - 1
                  len = strlen( c_point ) ) = c_point.
    ENDIF.

    " XCO
    IF xco_cp=>string( c_string )->ends_with( c_point ).
    ENDIF.

    CLEAR lt_parts.

    " Classic
    FIND ALL OCCURRENCES OF PCRE c_regex IN c_string RESULTS DATA(lt_found).
    LOOP AT lt_found INTO DATA(ls_found).
      INSERT c_string+ls_found-offset(ls_found-length) INTO TABLE lt_parts.
    ENDLOOP.

    CLEAR lt_parts.

    " Modern
    ld_start = 0.
    DO.
      DATA(ld_position) = find( val  = c_string
                                pcre = c_regex
                                off  = ld_start ).
      IF ld_position = -1.
        EXIT.
      ENDIF.

      DATA(ld_to) = find_end( val  = c_string
                              pcre = c_regex
                              off  = ld_start ).

      INSERT substring( val = c_string
                        off = ld_position
                        len = ld_to - ld_position ) INTO TABLE lt_parts.
      ld_start = ld_to.
    ENDDO.

    " XCO
    lt_parts = xco_cp=>string( c_string )->grep( iv_regular_expression = c_regex
                                                 io_engine             = xco_cp_regular_expression=>engine->pcre( )
                                )->value.

    lt_parts = xco_cp=>string( `MyNameIsPascal` )->decompose( xco_cp_string=>decomposition->pascal_case )->value.

    " Classic
    CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
      EXPORTING
        text   = c_string
      IMPORTING
        buffer = ld_xstring
      EXCEPTIONS
        failed = 1
        OTHERS = 2.
    IF sy-subrc <> 0.
    ENDIF.

    " Modern
    ld_xstring = cl_abap_codepage=>convert_to( source = c_string ).

    " XCO
    ld_xstring = xco_cp=>string( c_string )->as_xstring( xco_cp_character=>code_page->utf_8 )->value.

    " XCO
    DATA(ls_message) = xco_cp=>string( c_long_string )->as_message( xco_cp_message=>type->error )->value.

    " XCO
    DATA(lo_message) = NEW cx_abap_context_info_error( ).
    xco_cp=>string( c_long_string )->as_message( )->write_to_t100_dyn_msg( lo_message ).
  ENDMETHOD.


  METHOD operations_with_strings.
    DATA ld_string TYPE string.
    DATA lt_parts  TYPE string_table.
    DATA ld_result TYPE string.
    DATA ld_index  TYPE if_xco_strings=>tv_index.

    DATA(lt_strings) = VALUE string_table( ( `This` )
                                           ( `is` )
                                           ( `the` )
                                           ( `strings` )
                                           ( `class` ) ).

    " Classic
    READ TABLE lt_strings INDEX 5 INTO ld_string.

    " Modern
    ld_string = lt_strings[ 5 ].

    " XCO
    ld_string = xco_cp=>strings( lt_strings )->get( 5 )->value.

    " Classic
    LOOP AT lt_strings INTO ld_string.
      IF sy-tabix >= 2 AND sy-tabix <= 3.
        APPEND ld_string TO lt_parts.
      ENDIF.
    ENDLOOP.

    CLEAR lt_parts.

    " Modern
    LOOP AT lt_strings INTO ld_string FROM 2 TO 3.
      INSERT ld_string INTO TABLE lt_parts.
    ENDLOOP.

    " XCO
    lt_parts = xco_cp=>strings( lt_strings )->from( 2 )->to( 2 )->value.

    CLEAR ld_result.

    " Classic
    LOOP AT lt_strings INTO ld_string.
      DATA(ld_field) = ld_string+0(1).
      TRANSLATE ld_field TO UPPER CASE.
      CONCATENATE ld_result ld_field ld_string+1 INTO ld_result.
    ENDLOOP.

    CLEAR ld_result.

    " Modern
    LOOP AT lt_strings INTO ld_string.
      ld_result &&= to_upper( substring( val = ld_string
                                         len = 1 ) ) && substring( val = ld_string
                                                                   off = 1 ).
    ENDLOOP.

    " XCO
    ld_result = xco_cp=>strings( lt_strings )->compose( xco_cp_string=>composition->pascal_case )->value.

    DATA(lt_index) = VALUE if_xco_strings=>tt_indices( ( 3 ) ( 4 ) ( 5 ) ( 2 ) ( 1 ) ).
    CLEAR lt_parts.

    " Classic
    LOOP AT lt_index INTO ld_index.
      READ TABLE lt_strings INTO ld_string INDEX ld_index.
      APPEND ld_string TO lt_parts.
    ENDLOOP.

    CLEAR lt_parts.

    " Modern
    LOOP AT lt_index INTO ld_index.
      INSERT lt_strings[ ld_index ] INTO TABLE lt_parts.
    ENDLOOP.

    " XCO
    lt_parts = xco_cp=>strings( lt_strings )->reorder( lt_index )->value.

    CLEAR lt_parts.

    " Classic
    LOOP AT lt_strings INTO ld_string.
      INSERT ld_string INTO lt_parts INDEX 1.
    ENDLOOP.

    CLEAR lt_parts.

    " Modern
    LOOP AT lt_strings INTO ld_string STEP -1.
      INSERT ld_string INTO TABLE lt_parts.
    ENDLOOP.

    " XCO
    lt_parts = xco_cp=>strings( lt_strings )->reverse( )->value.
  ENDMETHOD.


  METHOD operations_with_xstring.
    DATA ld_string TYPE string.

    " Classic
    CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
      EXPORTING
        im_xstring = c_xstring
      IMPORTING
        ex_string  = ld_string.

    " Modern
    ld_string = cl_abap_codepage=>convert_from( source = c_xstring ).

    " XCO
    ld_string = xco_cp=>xstring( c_xstring )->as_string( xco_cp_character=>code_page->utf_8 )->value.
  ENDMETHOD.


  METHOD split_performance.
    DATA lo_run    TYPE REF TO zcl_bs_demo_runtime.
    DATA lr_string TYPE REF TO string.
    DATA lt_split  TYPE string_table.

    DATA(lt_strings) = get_random_strings( 5000 ).

    lo_run = NEW zcl_bs_demo_runtime( ).
    LOOP AT lt_strings REFERENCE INTO lr_string.
      SPLIT lr_string->* AT c_seperator INTO TABLE lt_split.
    ENDLOOP.
    io_out->write( |Native SPLIT     : { lo_run->get_diff( ) }| ).

    lo_run = NEW zcl_bs_demo_runtime( ).
    LOOP AT lt_strings REFERENCE INTO lr_string.
      lt_split = xco_cp=>string( lr_string->* )->split( c_seperator )->value.
    ENDLOOP.
    io_out->write( |XCO String Split : { lo_run->get_diff( ) }| ).
  ENDMETHOD.


  METHOD get_random_strings.
    DATA(lt_parts) = VALUE string_table( ( `Apple` )
                                         ( `Banana` )
                                         ( `Mango` )
                                         ( `Kiwi` )
                                         ( `Ananas` )
                                         ( `Orange` )
                                         ( `Citron` )
                                         ( `Lime` )
                                         ( `Cherry` )
                                         ( `Apricot` )
                                         ( `Plum` )
                                         ( `Pear` )
                                         ( `Blueberry` )
                                         ( `Grapes` )
                                         ( `Salmonberry` )
                                         ( `Raspberry` )
                                         ( `Honeydew` ) ).

    DATA(lo_rand_strings) = NEW zcl_bs_demo_random( id_min = 1
                                                    id_max = lines( lt_parts ) ).
    DATA(lo_rand_parts) = NEW zcl_bs_demo_random( id_min = 5
                                                  id_max = 10 ).

    DO id_lines TIMES.
      INSERT INITIAL LINE INTO TABLE rt_result REFERENCE INTO DATA(lr_line).

      DO lo_rand_parts->rand( ) TIMES.
        lr_line->* &&= | { lt_parts[ lo_rand_strings->rand( ) ] }|.
      ENDDO.
    ENDDO.
  ENDMETHOD.
ENDCLASS.

 

Fazit

Die XCO Klassen können an einigen Stellen Code sparen, vor allem wenn es um komplexere Aktionen geht. Hier jedes Mal Logik neu zu entwickeln und zu testen macht keinen Sinn. Daher eine klare Empfehlung zur Verwendung der Klasse, wenn es sich nicht um Standardoperationen handelt.

 

Quelle:
SAP Help - XCO String


Enthaltene Themen:
Modernes ABAPXCOStringsXCO_CP
Kommentare (0)



Und weiter ...

Bist du zufrieden mit dem Inhalt des Artikels? Wir posten jeden Freitag neuen Content im Bereich ABAP und unregelmäßig in allen anderen Bereichen. Schaue bei unseren Tools und Apps vorbei, diese stellen wir kostenlos zur Verfügung.


ABAP - XCO Excel

Kategorie - ABAP

Was kann eigentlich die XCO Bibliothek für Excel in ABAP? Hier schauen wir uns den aktuellen Stand der API an.

29.11.2024

ABAP - XCO Bibliotheken

Kategorie - ABAP

Was kannst du mit der Bibliothek in ABAP und ABAP Cloud machen und wie nutzt du die Objekte am besten? Hier erfährst du mehr.

12.11.2024

ABAP - Type Casting

Kategorie - ABAP

Wie kommst du eigentlich an den ursprünglichen Typ einer Klasse bzw. Instanz, wenn diese in einer generischen Tabelle übergeben wird? In diesem Artikel prüfen wir die Möglichkeiten.

16.04.2024

ABAP - RETURN value

Kategorie - ABAP

Nach all den Jahren ist nun endlich der "echte" Return in ABAP angekommen, in diesem Artikel zeigen wir dir, wie der funktioniert und was er kann.

13.02.2024

ABAP Deep Dive - FOR (Schleifen)

Kategorie - ABAP

Schauen wir uns einmal die FOR Schleife etwas näher an. Wie funktioniert sie? Was muss ich beachten und was kann ich damit tun?

14.04.2023