[ABAP] Eine Transaktion in einem neuen Fenster (Task) aufrufen

DATA: it_params TYPE STANDARD TABLE OF tpara.

START-OF-SELECTION.
* Parameter für die Transaktion
  it_params = VALUE #( ( paramid = 'BUK' partext = '0001' )
                       ( paramid = 'BLN' partext = '12345678' )
                       ( paramid = 'GJR' partext = '2016' ) ).

* RFC-Aufruf für Transaktion FB03 in neuem Task
  CALL FUNCTION 'CC_CALL_TRANSACTION_NEW_TASK' STARTING NEW TASK 'FB03_TASK' DESTINATION 'NONE'
    EXPORTING
      transaction           = 'FB03'
      skip_first_screen     = abap_false
    TABLES
      paramtab              = it_params
    EXCEPTIONS
      communication_failure = 97
      system_failure        = 98
      OTHERS                = 99.

  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.

[ABAP] System Callstack (Aufrufreihenfolge) lesen

Möglichkeit 1 (SYSTEM_CALLSTACK)

DATA: it_abap_callstack TYPE abap_callstack.
DATA: it_syst_callstack TYPE sys_callst.

* Callstack ermitteln
CALL FUNCTION 'SYSTEM_CALLSTACK'
  IMPORTING
    callstack    = it_abap_callstack
    et_callstack = it_syst_callstack.

IF sy-subrc = 0.
  cl_demo_output=>write_data( it_abap_callstack ).
  cl_demo_output=>write_data( it_syst_callstack ).

* 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        = |Stackaufrufe|
                                html_string  = lv_html
                                container    = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
  WRITE: space.
ENDIF.

Möglichkeit 2 (cl_abap_get_call_stack)

* Aufrufstapel auslesen
DATA(it_stack) = cl_abap_get_call_stack=>get_call_stack( ).
DATA(it_stack_formattet) = cl_abap_get_call_stack=>format_call_stack_with_struct( it_stack ).

IF sy-subrc = 0.
  cl_demo_output=>write_data( it_stack ).
  cl_demo_output=>write_data( it_stack_formattet ).

* 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        = |Stackaufrufe|
                                html_string  = lv_html
                                container    = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
  WRITE: space.
ENDIF.

[ABAP] Interne Tabelle mit Strings definieren

* Variante 1: unsortiert, ohne Schlüssel
DATA(it_names) = VALUE stringtab( ( |Horst| )
                                  ( |Udo| )
                                  ( |Heinz| ) ).

* Variante 2: sortiert, mit Schlüssel
TYPES: ty_sorted TYPE SORTED TABLE OF string WITH UNIQUE KEY table_line.

* strings dürfen nicht doppelt auftreten, sonst Duplicate-Key-Exception.
DATA(it_sorted) = VALUE ty_sorted( ( |Horst| )
                                   ( |Udo| )
                                   ( |Heinz| ) ).

[ABAP] Stringarray (interne Tabelle) zu einem String mit Separator verbinden (analog zu PHP implode)

Variante 1 (stringtab, Separator “;”)

DATA(it_strings) = VALUE stringtab( ( |Horst| )
                                    ( |Udo| )
                                    ( |Heinz| ) ).

DATA(ret) = concat_lines_of( table = it_strings sep = ';' ).

WRITE: / ret.

Variante 2 (stringtab, Separator ” “)

DATA(it_strings) = VALUE stringtab( ( |Horst| )
                                    ( |Udo| )
                                    ( |Heinz| ) ).

* Leerzeichen als Separator --> ' ' funktioniert nicht!
DATA(ret) = concat_lines_of( table = it_strings sep = | | ).

WRITE: / ret.

Variante 3 (TYPES)

TYPES: ty_names TYPE STANDARD TABLE OF string WITH EMPTY KEY.

START-OF-SELECTION.

  DATA(it_strings) = VALUE ty_names( ( |Horst| )
                                     ( |Udo| )
                                     ( |Heinz| ) ).

  DATA(ret) = concat_lines_of( table = it_strings sep = ';' ).

  WRITE: / ret.

[ABAP] Schleifenperformance durch Feldsymbole und binäre Suche verbessern

Variante 1 (langsam: keine Optimierung)

* Verkaufsbeleg: Kopfdaten
SELECT * FROM vbak INTO TABLE @DATA(it_vbak).
* Verkaufsbeleg: Positionsdaten
SELECT * FROM vbap INTO TABLE @DATA(it_vbap).

DATA(o_timer) = cl_abap_runtime=>create_hr_timer( ).
DATA(usec_start) = o_timer->get_runtime( ).

LOOP AT it_vbak ASSIGNING FIELD-SYMBOL(<k>).
  LOOP AT it_vbap ASSIGNING FIELD-SYMBOL(<p>) WHERE vbeln EQ <k>-vbeln.
    WRITE: / <p>-vbeln, <p>-matnr.
  ENDLOOP.
ENDLOOP.

DATA(usec_end) = o_timer->get_runtime( ).
DATA(usec) = CONV decfloat16( usec_end - usec_start ).
DATA(sec) = usec / 1000000.

WRITE: / 'Laufzeit:', sec, 's'.

Variante 2 (schnell: FIELD-SYMBOL, BINARY SEARCH)

* Verkaufsbeleg: Kopfdaten
SELECT * FROM vbak INTO TABLE @DATA(it_vbak).
* Verkaufsbeleg: Positionsdaten
SELECT * FROM vbap INTO TABLE @DATA(it_vbap).

* Tabelle muss aufsteigend sortiert sein, sonst stimmt der Rückgabeindex bei der binären Suche nicht
SORT: it_vbak BY vbeln.
SORT: it_vbap BY vbeln.

DATA(o_timer) = cl_abap_runtime=>create_hr_timer( ).
DATA(usec_start) = o_timer->get_runtime( ).

LOOP AT it_vbak ASSIGNING FIELD-SYMBOL(<k>).
* binäre Suche mit READ TABLE
* -> sollen stattdessen Table-Expressions verwendet werden, muss ein Sorted Key benutzt werden
  READ TABLE it_vbap TRANSPORTING NO FIELDS WITH KEY vbeln = <k>-vbeln BINARY SEARCH.
* gefundenen Index merken
  DATA(lv_index) = sy-tabix.

  IF sy-subrc = 0.
* Suche in der sortierten Tabelle ab Index lv_index
    LOOP AT it_vbap ASSIGNING FIELD-SYMBOL(<p>) FROM lv_index WHERE vbeln = <k>-vbeln.
      WRITE: / <p>-vbeln, <p>-matnr.
    ENDLOOP.
  ELSE.
    WRITE: / 'Fehler.'.
  ENDIF.
ENDLOOP.

DATA(usec_end) = o_timer->get_runtime( ).
DATA(usec) = CONV decfloat16( usec_end - usec_start ).
DATA(sec) = usec / 1000000.

WRITE: / 'Laufzeit:', sec, 's'.

Variante 3 (am schnellsten: FIELD-SYMBOLS, HASHED TABLES, Secondary Keys)

DATA: it_vbak TYPE HASHED TABLE OF vbak WITH UNIQUE KEY vbeln.
DATA: it_vbap TYPE HASHED TABLE OF vbap WITH UNIQUE KEY vbeln posnr                             " Primary Key
                                        WITH NON-UNIQUE SORTED KEY vbeln_sort COMPONENTS vbeln. " Secondary Key

* Verkaufsbeleg: Kopfdaten
SELECT * FROM vbak INTO TABLE it_vbak.
* Verkaufsbeleg: Positionsdaten
SELECT * FROM vbap INTO TABLE it_vbap.

DATA(o_timer) = cl_abap_runtime=>create_hr_timer( ).
DATA(usec_start) = o_timer->get_runtime( ).

LOOP AT it_vbak ASSIGNING FIELD-SYMBOL(<k>).
* Nested Loop über Secondary Key vbeln_sort
* BINARY SEARCH wird durch die Verwendung des Secondary Keys implizit ausgeführt
  LOOP AT it_vbap ASSIGNING FIELD-SYMBOL(<p>) USING KEY vbeln_sort WHERE vbeln = <k>-vbeln.
    WRITE: / <p>-vbeln, <p>-matnr.
  ENDLOOP.
ENDLOOP.

DATA(usec_end) = o_timer->get_runtime( ).
DATA(usec) = CONV decfloat16( usec_end - usec_start ).
DATA(sec) = usec / 1000000.

WRITE: / 'Laufzeit:', sec, 's'.

Links

[ABAP] SAP Release Information anzeigen

DATA: kern_rel TYPE thllines-thline. " Kernel Release
DATA: kern_make_variant TYPE thllines-thline. " Makevariante
DATA: kern_dblib TYPE thllines-thline. " Database libraries
DATA: kern_comp_on TYPE thllines-thline. " compiled on
DATA: kern_comp_time TYPE thllines-thline. " compile time
DATA: kern_patchlevel TYPE thllines-thline. " patch level
DATA: kern_supportlevel TYPE thllines-thline. " support level
DATA: kern_patchnumber TYPE thllines-thline. " patch number
DATA: kern_sourceid TYPE thllines-thline. " source id
DATA: kern_comp_level TYPE i. " compatibility level of the kernel
DATA: supp_db_sap TYPE TABLE OF thllines. " database release (SAP, table SVERS)
DATA: supp_db_vendor TYPE TABLE OF thllines. " databse release (vendor)
DATA: supp_op_sys TYPE TABLE OF thllines. " operation system
DATA: patchcomment TYPE TABLE OF thllines. " patch level information

CALL FUNCTION 'TH_SAPREL4'
  IMPORTING
    kern_rel          = kern_rel
    kern_make_variant = kern_make_variant
    kern_dblib        = kern_dblib
    kern_comp_on      = kern_comp_on
    kern_comp_time    = kern_comp_time
    kern_patchlevel   = kern_patchlevel
    kern_supportlevel = kern_supportlevel
    kern_patchnumber  = kern_patchnumber
    kern_sourceid     = kern_sourceid
    kern_comp_level   = kern_comp_level
  TABLES
    supp_db_sap       = supp_db_sap
    supp_db_vendor    = supp_db_vendor
    supp_op_sys       = supp_op_sys
    patchcomment      = patchcomment.

WRITE: / |Kernel Release: { kern_rel }|.
WRITE: / |Makevariante: { kern_make_variant }|.
WRITE: / |Database libraries: { kern_dblib }|.

WRITE: / |compiled on: { kern_comp_on }|.
WRITE: / |compile time: { kern_comp_time }|.
WRITE: / |patch level: { kern_patchlevel }|.
WRITE: / |support level: { kern_supportlevel }|.
WRITE: / |patch number: { kern_patchnumber }|.
WRITE: / |source id: { kern_sourceid }|.
WRITE: / |compatibility level of the kernel: { kern_comp_level }|.

WRITE: / |database release (SAP, table SVERS):|.
LOOP AT supp_db_sap INTO DATA(rel).
  WRITE: / |{ rel-thline }|.
ENDLOOP.

WRITE: / |databse release (vendor):|.
LOOP AT supp_db_vendor INTO DATA(ven).
  WRITE: / |{ ven-thline }|.
ENDLOOP.

WRITE: / |operation system:|.
LOOP AT supp_op_sys INTO DATA(op).
  WRITE: / |{ op-thline }|.
ENDLOOP.

WRITE: / |patch level information:|.
LOOP AT patchcomment INTO DATA(patch).
  WRITE: / |{ patch-thline }|.
ENDLOOP.