[ABAP] Hilfsvariablen mit LET-Ausdruck definieren

LET

  • Verwendung innerhalb von Operatoren NEW, VALUE, CONV, COND, SWITCH, REDUCE, FOR …
  • es konnen inplace Variablen oder Feldsymbole deklariert werden
  • Variablen, die im LET-Ausdruck definiert wurden k?nnen nur innerhalb des jeweiligen Scopes verwendet werden

Variante 1 (Variablendefinition, CONV)

* Carrier
PARAMETERS: p_carrid TYPE scarr-carrid DEFAULT 'LH'.

START-OF-SELECTION.

* Daten holen
  SELECT * FROM scarr INTO TABLE @DATA(it_carr).

  TRY.
* String zusammenbauen
      DATA(lv_carr_name) = CONV string(
* Hilfsvariablen per LET definieren
* ersten Carrier mit Carrid holen, kann Exception CX_SY_ITAB_LINE_NOT_FOUND werfen
                                        LET <c> = it_carr[ carrid = p_carrid ]
                                            dp  = |: |
* Hilfsvariablen verwenden
                                        IN
                                        |{ <c>-carrname }{ dp }{ <c>-url }| ).

      WRITE: / lv_carr_name.

* Exceptions abfangen
    CATCH cx_root INTO DATA(e_txt).
      WRITE: / e_txt->get_text( ).
  ENDTRY.

Variante 2 (Variablendefinition, COND)

DATA(lv_lang) = COND string(
* Hilfsvariablen per LET definieren
                             LET lang     = cl_abap_syst=>get_language( )
                                 lang_iso = cl_i18n_languages=>sap1_to_sap2( im_lang_sap1 = lang )
* Hilfsvariablen verwenden
                             IN
                             WHEN lang_iso = 'DE' THEN 'Deutsch'
                             WHEN lang_iso = 'EN' THEN 'Englisch'
                             ELSE 'andere Sprache'
                           ).

WRITE: / lv_lang.

Variante 3 (Tabelleneinträge, VALUE)

TYPES: BEGIN OF ty_s_adr,
         id   TYPE i,
         city TYPE string,
       END OF ty_s_adr.

TYPES: ty_it_adr TYPE STANDARD TABLE OF ty_s_adr WITH DEFAULT KEY.

TYPES: BEGIN OF ty_s_person,
         city_id  TYPE i,
         forename TYPE string,
         surename TYPE string,
         age      TYPE i,
       END OF ty_s_person.

TYPES: ty_it_persons TYPE STANDARD TABLE OF ty_s_person WITH DEFAULT KEY.

* Städte
DATA(it_city) = VALUE ty_it_adr(
                                 ( id = 100 city = 'Berlin' )
                                 ( id = 101 city = 'Hamburg' )
                                 ( id = 102 city = 'M?nchen' )
                               ).

* Tabelle mit Personen
DATA(it_persons) = VALUE ty_it_persons(
                                        ( city_id = 100 forename = 'Udo'   surename = 'Lehmann' age = 35 )
                                        ( city_id = 101 forename = 'Erika' surename = 'Müller'  age = 63 )
                                        ( city_id = 102 forename = 'Heinz' surename = 'Schulze' age = 65 )
                                ).

DATA(it_csv) = VALUE stringtab(
* alle Namen durchgehen
                                 FOR <p> IN it_persons INDEX INTO idx
* Hilfsvariablen zusammensetzen
                                   LET name       = |{ <p>-surename }, { <p>-forename }|
                                       city       = it_city[ id = <p>-city_id ]-city
                                       age_string = COND string( WHEN <p>-age > 63 THEN 'Rentner' ELSE 'kein Rentner' )
                                       output     = |{ idx };{ name };{ city };{ age_string }|
* Hilfsvariablen verwenden
                                   IN
* neue Zeile zu Tabelle hinzufügen
                                   ( output )
                               ).

* Anzeige
cl_demo_output=>display( it_csv ).

Variante 4 (CONV)

DATA(lv_i) = CONV i( LET x = 1 IN x ).
WRITE: / lv_i.

Variante 5 (NEW)

DATA(lv_i) = NEW i( LET x = 1 IN x ).
WRITE: / lv_i->*.

[ABAP] OO: Variablen, Strukturen, interne Tabellen, Objektreferenzen anlegen

Variable anlegen

* int
DATA(lv_int) = 1.
DATA(lv_int_empty) = VALUE i( ).
 
* float
DATA(lv_float_empty) = VALUE f( ).
DATA(lv_float) = CONV f( '0.1' ).
 
* char
DATA(lv_char) = 'ABCD'.
 
* string
DATA(lv_empty_string) = ||.
DATA(lv_string) = |Text|.
 
* bool
DATA(lv_bool) = abap_true.
 
* DDIC-Typ (z.B. MATNR)
DATA(lv_matnr) = CONV matnr( '1234567890' ).
DATA(lv_matnr_empty) = VALUE matnr( ).

Struktur anlegen

* definiert vom Anwender
TYPES: BEGIN OF ty_sflight,
         carrid TYPE sflight-carrid,
         connid TYPE sflight-connid,
       END OF ty_sflight.

DATA(lv_struct) = VALUE ty_sflight( carrid = 'LH'
                                    connid = '0123' ).

* Strukturtyp aus DDIC (leer)
DATA(lv_headdata_empty) = VALUE bapimathead( ).

* Strukturtyp aus DDIC (gefüllt)
DATA(lv_headdata) = VALUE bapimathead( material      = '1234567890'
                                       basic_view    = abap_true
                                       purchase_view = abap_true
                                       account_view  = abap_true ).

interne Tabelle anlegen

* definiert vom Anwender
TYPES: BEGIN OF ty_sflight,
         carrid TYPE sflight-carrid,
         connid TYPE sflight-connid,
       END OF ty_sflight.

TYPES: ty_it_sflight TYPE STANDARD TABLE OF ty_sflight WITH DEFAULT KEY.

DATA(it_tab) = VALUE ty_it_sflight( ( carrid = 'LH' connid = '0123' )
                                    ( carrid = 'AA' connid = '3210' ) ).

* Stringtable aus DDIC (leer)
DATA(it_stringtab_empty) = VALUE stringtab( ).

* Stringtable aus DDIC (gefüllt)
DATA(it_stringtab) = VALUE stringtab( ( |Udo| )
                                      ( |Heinz| )
                                      ( |Klaus| ) ).

Objektreferenz anlegen

* Objektreferenz auf Klasse ALV-Grid
DATA(o_alv) = NEW cl_gui_alv_grid( i_parent      = cl_gui_container=>default_screen
                                   i_appl_events = abap_true ).

* Referenz auf int
DATA(lv_int) = 1.
DATA(o_int) = REF #( lv_int ).

* Referenz auf stringtab
DATA(it_stringtab) = VALUE stringtab( ).
DATA(o_tab) = REF #( it_stringtab ).

[ABAP] Hexadezimale IP-Adresse in IPv4-String umwandeln

CLASS lcl_conv DEFINITION.
  PUBLIC SECTION.
*--------------------------------------------------------------------*
    CLASS-METHODS: ipv4hex_to_ipv4string
      IMPORTING
                i_hexadr      TYPE mshostadr
      RETURNING VALUE(ret_ip) TYPE string.
ENDCLASS.
*--------------------------------------------------------------------*
CLASS lcl_conv IMPLEMENTATION.
*--------------------------------------------------------------------*
* Konvertiert IP-Adresse (Hex) nach IPv4-String
*--------------------------------------------------------------------*
* -> i_hexadr - Hostadresse (IP) in Hex
* <- ret_ip   - IP-Adresse (IPv4)
*--------------------------------------------------------------------*
  METHOD ipv4hex_to_ipv4string.
* IP besteht aus 4 Bytes (Hex)
    IF xstrlen( i_hexadr ) = 4.
* jeder Hex-Wert wird in Integer konvertiert
      ret_ip = |{ CONV i( i_hexadr+0(1) ) }.{ CONV i( i_hexadr+1(1) ) }.{ CONV i( i_hexadr+2(1) ) }.{ CONV i( i_hexadr+3(1) ) }|.
    ENDIF.
  ENDMETHOD.
ENDCLASS.

* mshostadr -> TYPE RAW4 -> x
* 255.255.255.0
DATA: ip_hex TYPE mshostadr VALUE 'FFFFFF00'.

WRITE: / lcl_conv=>ipv4hex_to_ipv4string( ip_hex ).

[ABAP] Enumerator definieren

Variante 1 (einfaches Beispiel, mit impliziter Aufzählungskonstante 0..n)

TYPES:
  BEGIN OF ENUM e_drive_mode,
    forward,
    backward,
  END OF ENUM e_drive_mode.

DATA: lv_drivemode TYPE e_drive_mode.
lv_drivemode = forward.

DATA(lv_num) = CONV i( lv_drivemode ).

* FORWARD, 0
WRITE: / lv_drivemode, lv_num.

Variante 2 (explizite Aufzählungskonstante mit BASE TYPE)

TYPES:
  BEGIN OF ENUM e_drive_mode BASE TYPE symsgty,
    unknown  VALUE IS INITIAL,
    forward  VALUE 'F',
    backward VALUE 'B',
  END OF ENUM e_drive_mode.

DATA: lv_drivemode TYPE e_drive_mode.
lv_drivemode = forward.

DATA(lv_char) = CONV symsgty( lv_drivemode ).

* FORWARD, F
WRITE: / lv_drivemode, lv_char.

Variante 3 (Klassenbasiert, explizite Aufzählungskonstante mit BASE TYPE)

CLASS lcl_drive_mode DEFINITION FINAL.
  PUBLIC SECTION.
    TYPES: BEGIN OF ENUM e_drive_mode BASE TYPE symsgty,
             unknown  VALUE IS INITIAL,
             forward  VALUE 'F',
             backward VALUE 'B',
           END OF ENUM e_drive_mode.

    CLASS-METHODS:
      check_mode
        IMPORTING
                  i_drive_mode TYPE symsgty
        RETURNING VALUE(rv_ok) TYPE abap_bool.
ENDCLASS.

CLASS lcl_drive_mode IMPLEMENTATION.
  METHOD check_mode.
    rv_ok = abap_false.

    TRY.
* gibt es den übergebenen ENUM-Wert?
        DATA(lv_type) = CONV e_drive_mode( i_drive_mode ).
        rv_ok = abap_true.

      CATCH cx_root INTO DATA(e_txt).
    ENDTRY.

  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
* F
  DATA(lv_fwd) = CONV symsgty( lcl_drive_mode=>forward ).
  WRITE: / lv_fwd.

* lcl_drive_mode=>forward
  DATA(lv_type) = CONV lcl_drive_mode=>e_drive_mode( 'F' ).
  WRITE: / lv_type.

* Funktion zum Prüfen von ENUM-Werten
  IF abap_true = lcl_drive_mode=>check_mode( 'X' ).
    WRITE: / 'Enum-Wert vorhanden.'.
  ELSE.
    WRITE: / 'Enum-Wert nicht vorhanden.'.
  ENDIF.

Variante 4 (CL_ABAP_ENUMDESCR)

TYPES: BEGIN OF ENUM e_drive_mode BASE TYPE symsgty,
         unknown  VALUE IS INITIAL,
         forward  VALUE 'F',
         backward VALUE 'B',
       END OF ENUM e_drive_mode.

DATA(lv_mode) = VALUE e_drive_mode( ).

DATA(o_desc) = CAST cl_abap_enumdescr( cl_abap_typedescr=>describe_by_data( lv_mode ) ).

cl_demo_output=>write_data( o_desc->kind ).
cl_demo_output=>write_data( o_desc->type_kind ).
cl_demo_output=>write_data( o_desc->base_type_kind ).
cl_demo_output=>write_data( o_desc->members ).

* HTML-Code vom Demo-Output holen
DATA(lv_html) = cl_demo_output=>get( ).

* Daten im Inline-Browser im SAP-Fenster anzeigen
cl_abap_browser=>show_html( EXPORTING title       = 'ENUM'
                                      html_string = lv_html
                                      container   = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
WRITE: space.

Variante 5 (bis Release 750)

CONSTANTS: BEGIN OF e_status,
             open      TYPE i VALUE 0,
             close     TYPE i VALUE 1,
             undefined TYPE i VALUE 2,
           END OF e_status.

Links