[ABAP] RTTI / RTTC / RTTS: Verwendung von Typdescriptoren

* Typ-Beispiele:
* Struct
*   RSDSSELOPT
* Table
*   RSELOPTION
* Klasse
*   CL_DEMO_OUTPUT
* Interface
*   IF_RANDOM_NUMBER
* Datenelement
*   I
* Referenz
*   ?
PARAMETERS: p_name TYPE string DEFAULT 'RSDSSELOPT'.

START-OF-SELECTION.

  DATA(o_type_desc) = cl_abap_typedescr=>describe_by_name( p_name ).

  CASE o_type_desc->kind.
    WHEN cl_abap_typedescr=>kind_struct.
      DATA(o_struct_desc) = CAST cl_abap_structdescr( o_type_desc ).
      cl_demo_output=>write_data( o_struct_desc->components ).
    WHEN cl_abap_typedescr=>kind_table.
      DATA(o_table_desc) = CAST cl_abap_tabledescr( o_type_desc ).
      DATA(o_tl_struct_desc) = CAST cl_abap_structdescr( o_table_desc->get_table_line_type( ) ).
      cl_demo_output=>write_data( o_tl_struct_desc->components ).
    WHEN cl_abap_typedescr=>kind_class.
      DATA(o_class_desc) = CAST cl_abap_classdescr( o_type_desc ).
      LOOP AT o_class_desc->methods ASSIGNING FIELD-SYMBOL(<m>).
        cl_demo_output=>write( <m>-name ).
      ENDLOOP.
    WHEN cl_abap_typedescr=>kind_intf.
      DATA(o_if_desc) = CAST cl_abap_intfdescr( o_type_desc ).
      LOOP AT o_if_desc->methods ASSIGNING FIELD-SYMBOL(<i>).
        cl_demo_output=>write( <i>-name ).
      ENDLOOP.
    WHEN cl_abap_typedescr=>kind_elem.
      DATA(o_elem_desc) = CAST cl_abap_elemdescr( o_type_desc ).
      cl_demo_output=>write_data( o_elem_desc->type_kind ).
    WHEN cl_abap_typedescr=>kind_ref.
  ENDCASE.

  cl_demo_output=>display( ).

Links

[ABAP] Binärdaten: Bits setzen und auslesen, Bitoperationen

* DEMO_DATA_BIT
TRY.
* zwei Bytes
    DATA: lv_xa TYPE x LENGTH 1.
    DATA: lv_xb TYPE x LENGTH 1.

* Bit 1 und 8 setzen
    SET BIT 1 OF lv_xa.
    SET BIT 8 OF lv_xb.

* xstring mit Bit == 1 an der 7. Stelle
    DATA(lv_hex) = bit-set( 7 ).

    cl_demo_output=>write_data( lv_xa ).
    cl_demo_output=>write_data( lv_xb ).
    cl_demo_output=>write_data( lv_hex ).

* Bit 1 lesen
    DATA(lv_bit1) = 0.
    GET BIT 1 OF lv_xa INTO lv_bit1.

    cl_demo_output=>write_data( lv_bit1 ).

* Bit 8 lesen
    DATA(lv_bit8) = 0.
    GET BIT 8 OF lv_xb INTO lv_bit8.

    cl_demo_output=>write_data( lv_bit8 ).

    DATA: lv_and TYPE x LENGTH 1.
    DATA: lv_or TYPE x LENGTH 1.
    DATA: lv_xor TYPE x LENGTH 1.
    DATA: lv_not TYPE x LENGTH 1.

* AND
    lv_and = lv_xa BIT-AND lv_xb.
    cl_demo_output=>write_data( lv_and ).

* OR
    lv_or = lv_xa BIT-OR lv_xb.
    cl_demo_output=>write_data( lv_or ).

* XOR
    lv_xor = lv_xa BIT-XOR lv_xb BIT-XOR lv_hex.
    cl_demo_output=>write_data( lv_xor ).

* NOT
    lv_not = BIT-NOT lv_xb.
    cl_demo_output=>write_data( lv_not ).

* Bitweises lesen
    DATA(lv_bitstring_a) = ||.
    DATA(lv_bitstring_b) = ||.
    DATA(lv_bitstring_hex) = ||.
    DATA(lv_bitstring_and) = ||.
    DATA(lv_bitstring_or) = ||.
    DATA(lv_bitstring_xor) = ||.
    DATA(lv_bitstring_not) = ||.
    DO 8 TIMES.
      DATA(lv_bit) = 0.
      GET BIT sy-index OF lv_xa INTO lv_bit.
      lv_bitstring_a = lv_bitstring_a && lv_bit.
      GET BIT sy-index OF lv_xb INTO lv_bit.
      lv_bitstring_b = lv_bitstring_b && lv_bit.
      GET BIT sy-index OF lv_hex INTO lv_bit.
      lv_bitstring_hex = lv_bitstring_hex && lv_bit.
      GET BIT sy-index OF lv_and INTO lv_bit.
      lv_bitstring_and = lv_bitstring_and && lv_bit.
      GET BIT sy-index OF lv_or INTO lv_bit.
      lv_bitstring_or = lv_bitstring_or && lv_bit.
      GET BIT sy-index OF lv_xor INTO lv_bit.
      lv_bitstring_xor = lv_bitstring_xor && lv_bit.
      GET BIT sy-index OF lv_not INTO lv_bit.
      lv_bitstring_not = lv_bitstring_not && lv_bit.
    ENDDO.

    cl_demo_output=>write_data( lv_bitstring_a ).
    cl_demo_output=>write_data( lv_bitstring_b ).
    cl_demo_output=>write_data( lv_bitstring_hex ).
    cl_demo_output=>write_data( lv_bitstring_and ).
    cl_demo_output=>write_data( lv_bitstring_or ).
    cl_demo_output=>write_data( lv_bitstring_xor ).
    cl_demo_output=>write_data( lv_bitstring_not ).

    cl_demo_output=>display( ).
  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

[ABAP] Minimum / Maxium von zwei Zahlen ermitteln

DATA(it_values1) = VALUE int4_table( ( 1 ) ( 2 ) ( 3 ) ).
DATA(it_values2) = VALUE int4_table( ( 1 ) ( 5 ) ( 2 ) ).

DO lines( it_values1 ) TIMES.
  DATA(lv_min) = nmin( val1 = it_values1[ sy-index ] val2 = it_values2[ sy-index ] ).
  DATA(lv_max) = nmax( val1 = it_values1[ sy-index ] val2 = it_values2[ sy-index ] ).
  WRITE: / it_values1[ sy-index ], it_values2[ sy-index ], 'MIN:', lv_min.
  WRITE: / it_values1[ sy-index ], it_values2[ sy-index ], 'MAX:', lv_max.
ENDDO.

[ABAP] RegEx: Strings ersetzen

* Platzhalter: Zeichenkette, die ersetzt werden soll
DATA(lv_placeholder) = |<placeholder>|.
* Replacement: Zeichenkette, die anstelle des Platzhalters eingesetzt wird
DATA(lv_replacement) = | und |.

* Alle Vorkommen des Platzhalters im String finden
DATA(matcher) = cl_abap_matcher=>create( pattern     = lv_placeholder
                                         text        = 'Ich fahre gerne Auto<placeholder>Fahrrad<placeholder>Straßenbahn.'
                                         ignore_case = abap_true ).

* Alle Platzhalter mit Replacement ersetzen
IF matcher->replace_all( lv_replacement ) > 0.
  WRITE: / matcher->text.
ELSE.
  WRITE: / |Zeichenkette '{ lv_placeholder }' nicht im String vorhanden.|.
ENDIF.

[ABAP] RegEx: HTML-Tags aus String entfernen

* HTML
DATA(lv_html) = |<!DOCTYPE html>| &&
                |<html>| &&
                |<head>| &&
                |  <meta charset="utf-8">| &&
                |  <meta name="viewport" content="width=device-width">| &&
                |  <title>DOM Read</title>| &&
                |</head>| &&
                |<body>| &&
                |  <div id="bodytext"><b>Hallo Welt!</b></div>| &&
                |  <div id="bodytext">Weiterlesen: <a href="https://codezentrale.de">Link</a></div>| &&
                |</body>| &&
                |</html>|.

* Alle HTML-Tags finden
DATA(matcher) = cl_abap_matcher=>create( pattern     = '<([!A-Za-z][A-Za-z0-9]*)([^>]*)>|</([A-Za-z][A-Za-z0-9]*)>'
                                         text        = lv_html
                                         ignore_case = abap_true ).

* Alle gefundenen HTML-Tags mit '' ersetzen
IF matcher->replace_all( '' ) > 0.
  WRITE: / matcher->text.
ELSE.
  WRITE: / |Keine Tags gefunden.|.
ENDIF.