[ABAP] Open-SQL: Tabelleninhalte zusammenfügen (mergen)

Variante 1 (ab NW 7.40 SP08)

* it_status hat zwei Spalten mit jeweils einer tiefen Struktur
SELECT jcds~*, tj02t~*
  FROM jcds INNER JOIN tj02t
  ON jcds~stat = tj02t~istat
  WHERE tj02t~spras = @sy-langu
  INTO TABLE @DATA(it_status)
  UP TO 100 ROWS.

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

Variante 2 (bis NW 7.40 SP08)

* it_status hat alle Spalten aus beiden includierten Strukturen
TYPES: BEGIN OF ty_data.
        INCLUDE TYPE jcds.
        INCLUDE TYPE tj02t.
TYPES: END OF ty_data.

DATA: it_status TYPE STANDARD TABLE OF ty_data WITH DEFAULT KEY.

SELECT jcds~*, tj02t~*
  FROM jcds INNER JOIN tj02t
  ON jcds~stat = tj02t~istat
  WHERE tj02t~spras = @sy-langu
  INTO TABLE @it_status
  UP TO 100 ROWS.

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

[ABAP] String nach Integer konvertieren

Variante 1 (Typecast -> direkte Zuweisung)

DATA: lv_string TYPE string VALUE '01234567'.
DATA: lv_int TYPE i.

* Typecast durch direkte Zuweisung
lv_int = lv_string.

* Ausgabe: 1.234.567
WRITE: / lv_int.

Variante 2 (CL_ABAP_CONTAINER_UTILITIES)

* String
DATA(lv_str_val) = |123|.
* Int
DATA(lv_int) = 0.

* String -> Int
cl_abap_container_utilities=>read_container_c( EXPORTING
                                                 im_container = lv_str_val
                                               IMPORTING
                                                 ex_value     = lv_int ).

WRITE: / lv_int.

[ABAP] xstring nach RAW (binary) wandeln

Variante 1 (cl_bcs_convert)

DATA: lv_xstr TYPE xstring VALUE 'A0B0C0'.

DATA(it_raw_data) = cl_bcs_convert=>xstring_to_solix( EXPORTING iv_xstring = lv_xstr ).

Variante 2 (SCMS_XSTRING_TO_BINARY)

DATA: lv_xstr TYPE xstring VALUE 'A0B0C0'.
DATA: it_bin_data TYPE STANDARD TABLE OF raw255.

* xstring -> RAW (binary)
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
  EXPORTING
    buffer     = lv_xstr
  TABLES
    binary_tab = it_bin_data.

Variante 3 (cl_swf_utl_convert_xstring)

DATA: lv_xstr TYPE xstring VALUE 'A0B0C0'.
DATA: it_bin_data TYPE STANDARD TABLE OF raw255.

* xstring -> RAW (binary)
cl_swf_utl_convert_xstring=>xstring_to_table( EXPORTING
                                                i_stream = lv_xstr
                                              IMPORTING
                                                e_table  = it_bin_data ).

Variante 4 (cl_scp_change_db)

DATA: lv_size TYPE i.
DATA: lv_xstr TYPE xstring VALUE 'A0B0C0'.
DATA: it_bin_data TYPE STANDARD TABLE OF raw255.

* XString (Bytes) -> RAW (iTab)
cl_scp_change_db=>xstr_to_xtab( EXPORTING
                                  im_xstring = lv_xstr
                                IMPORTING
                                  ex_size    = lv_size
                                  ex_xtab    = it_bin_data ).

[ABAP] RAW (binary) nach xstring wandeln

Variante 1 (SCMS_BINARY_TO_XSTRING)

DATA: it_bin_data TYPE STANDARD TABLE OF raw255. " iTab mit Binärdaten
DATA: lv_bytes TYPE i.                           " reale Länge der Daten in Bytes
DATA: lv_xstr_result TYPE xstring.

...

CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
  EXPORTING
    input_length = lv_bytes
  IMPORTING
    buffer       = lv_xstr_result
  TABLES
    binary_tab   = it_bin_data
  EXCEPTIONS
    failed       = 1
    OTHERS       = 2.

IF sy-subrc NE 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

Variante 2 (cl_swf_utl_convert_xstring)

DATA: lv_size TYPE i.
DATA: it_raw_data TYPE STANDARD TABLE OF raw255.

cl_gui_frontend_services=>gui_upload( EXPORTING
                                        filename     = 'c:\temp\binaryfile.dat'
                                        filetype     = 'BIN'
                                        read_by_line = space
                                      IMPORTING
                                        filelength   = lv_size
                                      CHANGING
                                        data_tab     = it_raw_data ).

DATA(lv_xlsx_str) = cl_swf_utl_convert_xstring=>table_to_xstring( i_table = it_raw_data
                                                                  i_size  = lv_size ).

Variante 3 (cl_scp_change_db)

DATA: lv_size TYPE i.
DATA: it_raw_data TYPE STANDARD TABLE OF raw255.
DATA: lv_xstr_result TYPE xstring.

cl_gui_frontend_services=>gui_upload( EXPORTING
                                        filename     = 'c:\temp\binaryfile.dat'
                                        filetype     = 'BIN'
                                        read_by_line = space
                                      IMPORTING
                                        filelength   = lv_size
                                      CHANGING
                                        data_tab     = it_raw_data ).
                                        
cl_scp_change_db=>xtab_to_xstr( EXPORTING
                                  im_xtab    = it_raw_data
                                  im_size    = lv_size
                                IMPORTING
                                  ex_xstring = lv_xstr_result ).

Variante 4 (cl_bcs_convert)

* solix -> xstring
DATA: lv_size TYPE i.
DATA: it_raw_data TYPE solix_tab.

cl_gui_frontend_services=>gui_upload( EXPORTING
                                        filename     = 'c:\temp\binaryfile.dat'
                                        filetype     = 'BIN'
                                        read_by_line = space
                                      IMPORTING
                                        filelength   = lv_size
                                      CHANGING
                                        data_tab     = it_raw_data ).

DATA(lv_xstr_result) = cl_bcs_convert=>solix_to_xstring( it_solix = it_raw_data ).

Variante 5 (cl_abap_conv_obj)

DATA: it_bin_data TYPE raw255. " iTab mit Binärdaten
DATA: lv_bytes TYPE i.         " reale Länge der Daten in Bytes

...

DATA: lv_xstr_line TYPE xstring.
DATA: lv_xstr_result TYPE xstring.

* RAW (binary) -> xstring
DATA(o_conv) = NEW cl_abap_conv_obj( ).

LOOP AT it_bin_data ASSIGNING FIELD-SYMBOL(<l>).
* Zeile konvertieren
  o_conv->convert( EXPORTING
                     inbuff = <l>
                     outbufflg = 65535 " max. Zeilenlänge in it_bin_data
                   IMPORTING
                     outbuff = lv_xstr_line ).

* Zeilen zusammenbauen
  CONCATENATE lv_xstr_result lv_xstr_line INTO lv_xstr_result IN BYTE MODE.
ENDLOOP.

* evtl. Rest von xstring abschneiden, für reale Länge der Daten
lv_xstr_result = lv_xstr_result(lv_bytes).

[ABAP] Funktion InstanceOf

* Variante 1 (ab 7.50)
IF o_dock IS INSTANCE OF cl_gui_docking_container.
  WRITE: / 'Ok.'.
ENDIF.

* Variante 2 (ab 7.50)
CASE TYPE OF o_dock.
  WHEN TYPE cl_gui_docking_container INTO DATA(o_out).
    ...
  WHEN OTHERS.
    ...
ENDCASE.
 
* Variante 3 (bis 7.40)
IF abap_true = cl_lcr_util=>instanceof( object = o_dock
                                        class = 'CL_GUI_DOCKING_CONTAINER' ).
  WRITE: / 'Ok.'.
ENDIF.

* Variante 4 (bis 7.40)
IF abap_true = cl_wdy_wb_reflection_helper=>is_instance_of( object = o_dock
                                                            type_name = 'CL_GUI_DOCKING_CONTAINER' ).
  WRITE: / 'Ok.'.
ENDIF.

[ABAP] RTTS verwenden, um Feldnamen und Eigenschaften einer DB-Tabelle anzuzeigen

DATA: o_desc TYPE REF TO cl_abap_structdescr.

o_desc ?= cl_abap_structdescr=>describe_by_name( 'MARA' ).

DATA(o_ddic_fields) = o_desc->get_ddic_field_list( ).

LOOP AT o_ddic_fields INTO DATA(ls_ddfields) WHERE keyflag = 'X'.
  WRITE: / ls_ddfields-fieldname, ls_ddfields-fieldtext.
ENDLOOP.

[ABAP] Transienter Code / Dynamisch ABAP-Code generieren und ausführen

DATA: progname TYPE program.
DATA: msg TYPE string.
DATA: lin TYPE i.
DATA: wrd TYPE string.
DATA: off TYPE i.
DATA: mid TYPE trmsg_key.
DATA: sid TYPE string.

DATA(it_code) = VALUE stringtab( ( |PROGRAM SUBPOOL.| )
                                 ( |CLASS main DEFINITION.| )
                                 ( |  PUBLIC SECTION.| )
                                 ( |    CLASS-METHODS show| )
                                 ( |      IMPORTING| )
                                 ( |        i_txt TYPE string| )
                                 ( |      RETURNING VALUE(ret_val) TYPE string.| )
                                 ( |ENDCLASS.| )
                                 ( |CLASS main IMPLEMENTATION.| )
                                 ( |  METHOD show.| )
                                 ( |    WRITE: / i_txt.| )
                                 ( |    ret_val = \|\{ i_txt \} - Return value.\|.| )
                                 ( |  ENDMETHOD.| )
                                 ( |ENDCLASS.| ) ).

* Subroutinen-Pool im ABAP-Speicher des akt. Programms erzeugen
* it_code wird übergeben, Programmname wird temporär vom System vergeben
GENERATE SUBROUTINE POOL it_code NAME progname MESSAGE msg LINE lin WORD wrd OFFSET off MESSAGE-ID mid SHORTDUMP-ID sid.

CASE sy-subrc.
  WHEN 0. " ok
    TRY.
* dynamischen Klassennamen ermitteln
        DATA(lv_class) = |\\PROGRAM={ progname }\\CLASS=MAIN|.
        DATA: ret TYPE string.

        WRITE: / 'Programm:', progname.
        WRITE: / 'Class:', lv_class.
        SKIP.

* statischer Methodenaufruf
        CALL METHOD (lv_class)=>show
          EXPORTING
            i_txt   = 'Static call'
          RECEIVING
            ret_val = ret.

        WRITE: / ret.

* dynamischer Methodenaufruf
        DATA o_ref TYPE REF TO object.
        CREATE OBJECT o_ref TYPE (lv_class).
        CALL METHOD o_ref->('SHOW')
          EXPORTING
            i_txt   = 'Dynamic call'
          RECEIVING
            ret_val = ret.

        WRITE: / ret.

      CATCH cx_root INTO DATA(e_text).
        MESSAGE e_text->get_text( ) TYPE 'I'.
    ENDTRY.

  WHEN 4. " Syntaxfehler
    WRITE: / msg.
  WHEN 8. " Laufzeitfehler
    WRITE: / sid.
  WHEN OTHERS.
    MESSAGE 'Unbekannter Fehler.' TYPE 'I'.
ENDCASE.

Weiterführende Infos: Link