[ABAP] Testen, ob per RFC ein Funktionsbaustein im Zielsystem vorhanden ist

* https://www.berater-wiki.de/RFC-Funktionsbausteine
* https://download.consolut.com/direct/SAP_PrintDoku/de/BCFESDE2/BCFESDE2.PDF

* Funktionsbaustein-Name, verwendet Suchhilfe pb_func_key
PARAMETERS: p_func TYPE rs38l_fnam MATCHCODE OBJECT pb_func_key.
* RFC-Verbindung
PARAMETERS: p_rfc TYPE rfcdest.

START-OF-SELECTION.

* Nachschauen, ob RFC-Verbindung vorhanden
  SELECT SINGLE d~rfcdest, d~rfctype, d~rfcoptions, t~rfcdoc1, t~rfcdoc2, t~rfcdoc3
    INTO @DATA(lv_rfc)
    FROM rfcdes AS d
    INNER JOIN rfcdoc AS t ON ( d~rfcdest = t~rfcdest )
    WHERE d~rfcdest = @p_rfc
      AND t~rfclang = @sy-langu.

  IF sy-subrc = 0.
    DATA: lv_err_msg TYPE char255.
* wenn RFC-Verbindung vorhanden -> anpingen und Systemfehler (Dumps) abfangen
    CALL FUNCTION 'RFC_PING' DESTINATION p_rfc
      EXCEPTIONS
        system_failure        = 1 MESSAGE lv_err_msg
        communication_failure = 2 MESSAGE lv_err_msg
        OTHERS                = 3.

    IF sy-subrc = 0.
* RFC-Ping ok
      WRITE: / '[', p_rfc, '] RFC-Aufruf erfolgreich.'.

* Existenzprüfung und Funktionsgruppe zu Funktionsbaustein besorgen
      CALL FUNCTION 'FUNCTION_EXISTS' DESTINATION p_rfc
        EXPORTING
          funcname           = p_func
        EXCEPTIONS
          function_not_exist = 1
          OTHERS             = 2.

      IF sy-subrc = 0.
        WRITE: / 'Funktionsbaustein:', p_func, 'existiert im Zielsystem:', p_rfc.
      ELSE.
        WRITE: / 'Funktionsbaustein:', p_func, 'existiert nicht im Zielsystem:', p_rfc.
      ENDIF.
    ELSE.
* RFC-Ping fehlerhaft
      WRITE: / '[', p_rfc, '] RFC-Aufruf gescheitert:', lv_err_msg.
    ENDIF.
  ELSE.
* RFC-Verbindung nicht vorhanden
    WRITE: / '[', p_rfc, '] RFC-Verbindung nicht vorhanden.'.
  ENDIF.

[ABAP] Editierbares SALV-Grid (IF_SALV_GUI_OM_EXTEND_GRID_API, IF_SALV_GUI_OM_EDIT_RESTRICTED)

* Quelle: https://blogs.sap.com/2022/08/01/editable-cl_salv_table-after-release-756/
* ab SAP Release 756
* Achtung: das Ganze funktioniert nur für kleine Tabellen mit max. 5000 Zellen, siehe:
*
* Methode: CL_SALV_GUI_OM_ADAPTER_TABLE->CAN_RUN_RESTRICTED_EDIT_MODE( )
* Konstante: CV_MAX_CELLS_FOR_EDITABLE (Wert: 5000).

* Eventhandler
CLASS lcl_events DEFINITION.
  PUBLIC SECTION.
* Bezeichner der Buttons
    CONSTANTS: co_btn_edit TYPE string VALUE 'BTN_EDIT'.
    CONSTANTS: co_btn_save TYPE string VALUE 'BTN_SAVE'.

* Platzhalter für Referenz auf SALV-Grid
    CLASS-DATA: o_salv TYPE REF TO cl_salv_table.

* Eventhandler-Methode für Button-Klicks in der Toolbar des SALV-Grids
    CLASS-METHODS : on_toolbar_click FOR EVENT added_function OF cl_salv_events_table
      IMPORTING
        e_salv_function
        sender.
  PRIVATE SECTION.
* Edit-Status des SALV-Grids
    CLASS-DATA: gv_edit TYPE abap_bool VALUE abap_false.
ENDCLASS.

CLASS lcl_events IMPLEMENTATION.
  METHOD on_toolbar_click.
    IF o_salv IS BOUND.

      DATA(o_api) = o_salv->extended_grid_api( ).
      DATA(o_edit) = o_api->editable_restricted( ).

      CASE e_salv_function.

        WHEN co_btn_edit.
* Edit-Modus umschalten
          IF gv_edit = abap_false.
            gv_edit = abap_true.
          ELSE.
            gv_edit = abap_false.
          ENDIF.

          TRY.
* Spalte(n) (nicht) editierbar setzen
              o_edit->set_attributes_for_columnname( EXPORTING columnname              = 'EKGRP'
                                                               all_cells_input_enabled = gv_edit ).

              o_edit->set_attributes_for_columnname( EXPORTING columnname              = 'SMTP_ADDR'
                                                               all_cells_input_enabled = gv_edit ).
            CATCH cx_salv_not_found.
          ENDTRY.

          o_edit->validate_changed_data( ).
          o_salv->refresh( ).

        WHEN co_btn_save.
* Daten auf Validität prüfen
          DATA(lv_data_is_valid) = abap_false.

          TRY.
              o_edit->validate_changed_data( IMPORTING is_input_data_valid = lv_data_is_valid ).
              o_salv->refresh( ).
            CATCH cx_salv_not_found.
          ENDTRY.

          IF lv_data_is_valid = abap_true.
* Daten hier speichern / weiterverarbeiten
            MESSAGE co_btn_save TYPE 'I'.
          ENDIF.
      ENDCASE.
    ENDIF.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.

  TRY.
* Beispieldaten (Einkäufergruppen) holen
      SELECT FROM t024
        FIELDS *
        INTO TABLE @DATA(it_t024).

      IF sy-subrc = 0.
        cl_salv_table=>factory( EXPORTING r_container  = cl_gui_container=>default_screen
                                IMPORTING r_salv_table = lcl_events=>o_salv
                                CHANGING  t_table      = it_t024 ).

* Standardbuttons der SALV-Table ausblenden
        lcl_events=>o_salv->get_functions( )->set_all( abap_false ).

* Eigenen SALV-Button hinzufügen
* das Hinzufügen des Buttons funktioniert nur, wenn die SALV-Table innerhalb eines Containers (z.B. cl_gui_container=>default_screen) eingebettet ist
        lcl_events=>o_salv->get_functions( )->add_function( name = |{ lcl_events=>co_btn_edit }|
                                                            icon = |{ icon_edit_file }|
                                                            text = 'Edit'
                                                            tooltip = 'Daten editieren'
                                                            position = if_salv_c_function_position=>right_of_salv_functions ).

        lcl_events=>o_salv->get_functions( )->add_function( name = |{ lcl_events=>co_btn_save }|
                                                            icon = |{ icon_save_as_template }|
                                                            text = 'Save'
                                                            tooltip = 'Daten speichern'
                                                            position = if_salv_c_function_position=>right_of_salv_functions ).

* Eventhandler für Klicks in die Toolbar des SALV-Grids setzen
        SET HANDLER lcl_events=>on_toolbar_click FOR lcl_events=>o_salv->get_event( ).

* SALV anzeigen
        lcl_events=>o_salv->display( ).

* Toolbar der Listausgabe unterdrücken
        cl_abap_list_layout=>suppress_toolbar( ).

* Listausgabe erzwingen für Erzeugung von cl_gui_container=>default_screen
        WRITE: space.

      ENDIF.
    CATCH cx_root INTO DATA(e_txt).
      WRITE: / e_txt->get_text( ).
  ENDTRY.

[ABAP] Neues SAP-Fenster (Modus) öffnen und wieder schließen

* Bsp.: Transaktion SU3
PARAMETERS: p_tcode TYPE tcode DEFAULT 'SU3'.

START-OF-SELECTION.

  DATA: lv_mode TYPE sy-index.

* Eröffnen eines neuen externen Modus
  CALL FUNCTION 'TH_CREATE_MODE'
    EXPORTING
      transaktion    = p_tcode
    IMPORTING
      mode           = lv_mode
    EXCEPTIONS
      max_sessions   = 1
      internal_error = 2
      no_authority   = 3
      OTHERS         = 4.

  IF sy-subrc = 0.
    WRITE: / 'Transaktion:', p_tcode.
    WRITE: / 'Modus:', lv_mode.

    DATA: ret TYPE string.

    CALL FUNCTION 'POPUP_TO_CONFIRM'
      EXPORTING
        titlebar              = 'Modus'
        text_question         = 'Modus wieder schließen?'
        display_cancel_button = abap_false
      IMPORTING
        answer                = ret.

    CASE ret.
      WHEN '1'.
* Löschen eines externen Modus
        CALL FUNCTION 'TH_DELETE_MODE'
          EXPORTING
            mode = lv_mode.
      WHEN OTHERS.
    ENDCASE.
  ENDIF.

[ABAP] Infos zu Datenelementen und Domänen lesen

* Name Datenelement
PARAMETERS: p_dtype TYPE ddobjname DEFAULT 'CCCATEGORY'.

START-OF-SELECTION.

  DATA: lv_gotstate	TYPE ddgotstate.
  DATA: lv_dd04v_wa	TYPE dd04v.
  DATA: lv_tpara_wa	TYPE tpara.

* DD: Schnittstelle zum Lesen eines Datenelements aus dem ABAP/4 Dictionary
  CALL FUNCTION 'DDIF_DTEL_GET'
    EXPORTING
      name          = p_dtype
    IMPORTING
      gotstate      = lv_gotstate
      dd04v_wa      = lv_dd04v_wa
      tpara_wa      = lv_tpara_wa
    EXCEPTIONS
      illegal_input = 1
      OTHERS        = 2.

  IF sy-subrc = 0.
    DATA: lv_gotstate_d	TYPE ddgotstate.
    DATA: lv_dd01v_wa	TYPE dd01v.
    DATA: it_dd07v_tab TYPE STANDARD TABLE OF dd07v WITH DEFAULT KEY.

* DD: Schnittstelle zum Lesen einer Domäne aus dem ABAP/4 Dictionary
    CALL FUNCTION 'DDIF_DOMA_GET'
      EXPORTING
        name          = lv_dd04v_wa-domname
      IMPORTING
        gotstate      = lv_gotstate_d
        dd01v_wa      = lv_dd01v_wa
      TABLES
        dd07v_tab     = it_dd07v_tab
      EXCEPTIONS
        illegal_input = 1
        OTHERS        = 2.

    IF sy-subrc = 0.
      cl_demo_output=>next_section( |Datentyp { p_dtype }| ).
      cl_demo_output=>write_data( lv_gotstate ).
      cl_demo_output=>write_data( lv_dd04v_wa ).
      cl_demo_output=>write_data( lv_tpara_wa ).

      cl_demo_output=>next_section( |Domäne { lv_dd04v_wa-domname }| ).
      cl_demo_output=>write_data( lv_gotstate_d ).
      cl_demo_output=>write_data( lv_dd01v_wa ).
      cl_demo_output=>write_data( it_dd07v_tab ).

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

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

Links

[ABAP] Informationen zu einem Dynpro ermitteln

SELECTION-SCREEN BEGIN OF LINE.
  SELECTION-SCREEN COMMENT (9) lbl1 FOR FIELD p_matnr.
  PARAMETERS: p_matnr TYPE matnr.
SELECTION-SCREEN END OF LINE.

INITIALIZATION.
  lbl1 = 'Material:'.

START-OF-SELECTION.

  DATA: lv_header TYPE rpy_dyhead.
  DATA: it_containers TYPE dycatt_tab.
  DATA: it_fields_to_containers TYPE dyfatc_tab.
  DATA: it_flow_logic TYPE swydyflow.

* Lesen eines Dynpros
  CALL FUNCTION 'RPY_DYNPRO_READ'
    EXPORTING
      progname             = sy-cprog
      dynnr                = sy-dynnr
    IMPORTING
      header               = lv_header
    TABLES
      containers           = it_containers
      fields_to_containers = it_fields_to_containers
      flow_logic           = it_flow_logic
    EXCEPTIONS
      cancelled            = 1
      not_found            = 2
      permission_error     = 3
      OTHERS               = 4.

  IF sy-subrc = 0.
    cl_demo_output=>write_data( lv_header ).
    cl_demo_output=>write_data( it_containers ).
    cl_demo_output=>write_data( it_fields_to_containers ).
    cl_demo_output=>write_data( it_flow_logic ).

* 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        = |Daten des Dynpros { sy-dynnr }|
                                  html_string  = lv_html
                                  container    = cl_gui_container=>default_screen ).

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

[ABAP] Installierte Softwarekomponenten ermitteln

DATA: it_comptab TYPE STANDARD TABLE OF cvers_sdu WITH DEFAULT KEY.

* Determines the installed software components
CALL FUNCTION 'DELIVERY_GET_INSTALLED_COMPS'
  TABLES
    tt_comptab       = it_comptab
  EXCEPTIONS
    no_release_found = 1
    OTHERS           = 2.

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

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

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

[ABAP] Eigenschaften einer Klasse prüfen

DATA(lv_class) = |CL_DEMO_OUTPUT|.
DATA(lv_interface) = |IF_DEMO_OUTPUT|.

* Aktiv?
IF cl_esh_ca_check=>is_active_class( CONV #( lv_class ) ) = abap_true.
  WRITE: / |Klasse { lv_class } ist aktiv.|.
ELSE.
  WRITE: / |Klasse { lv_class } ist nicht aktiv.|.
ENDIF.

* Instanziierbar?
IF cl_esh_ca_check=>is_instantiable_class( CONV #( lv_class ) ) = abap_true.
  WRITE: / |Klasse { lv_class } ist instanziierbar.|.
ELSE.
  WRITE: / |Klasse { lv_class } ist nicht instanziierbar.|.
ENDIF.

* Implementiert Interface?
IF cl_esh_ca_check=>is_interface_implem_class( iv_class = CONV #( lv_class ) iv_interface = CONV #( lv_interface ) ) = abap_true.
  WRITE: / |Klasse { lv_class } implementier Interface { lv_interface }.|.
ELSE.
  WRITE: / |Klasse { lv_class } implementier Interface { lv_interface } nicht.|.
ENDIF.

[ABAP] Element des Selektionsbiles über RadioButtons ein-/ausblenden

PARAMETERS

* PARAMETERS
* Element, dass ein-/bzw. ausgeblendet werden soll
SELECTION-SCREEN BEGIN OF LINE.
  SELECTION-SCREEN COMMENT (9) lbl1 FOR FIELD p_test.
  PARAMETERS: p_test TYPE matnr.
SELECTION-SCREEN END OF LINE.

* Radiobutton 1, sendet USER_COMMAND, damit beim Umschalten AT SELECTION-SCREEN OUTPUT ausgelöst wird
SELECTION-SCREEN BEGIN OF LINE.
  SELECTION-SCREEN COMMENT (9) lbl2 FOR FIELD p_rb1.
  PARAMETERS: p_rb1 RADIOBUTTON GROUP grp DEFAULT 'X' USER-COMMAND rb.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
  SELECTION-SCREEN COMMENT (9) lbl3 FOR FIELD p_rb2.
  PARAMETERS: p_rb2 RADIOBUTTON GROUP grp.
SELECTION-SCREEN END OF LINE.

INITIALIZATION.
  lbl1 = 'Material:'.
  lbl2 = '      An:'.
  lbl3 = '     Aus:'.

AT SELECTION-SCREEN OUTPUT.
* Elemente des Selektionsbiles durchgehen
  LOOP AT SCREEN INTO DATA(wa).
* Wenn Element 'P_TEST'
    IF wa-name = 'P_TEST'.
* Aktvsetzung in Abhängigkeit von RB2
      wa-active = COND #( WHEN p_rb2 = abap_true THEN 0 ELSE 1 ).
      MODIFY SCREEN FROM wa.
    ENDIF.
  ENDLOOP.

SELECT-OPTIONS

* Element, dass ein-/bzw. ausgeblendet werden soll
SELECTION-SCREEN BEGIN OF LINE.
  SELECTION-SCREEN COMMENT (9) lbl1 FOR FIELD so_test.
  SELECT-OPTIONS: so_test FOR sy-uname MODIF ID 100.
SELECTION-SCREEN END OF LINE.

* Radiobutton 1, sendet USER_COMMAND, damit beim Umschalten AT SELECTION-SCREEN OUTPUT ausgelöst wird
SELECTION-SCREEN BEGIN OF LINE.
  SELECTION-SCREEN COMMENT (9) lbl2 FOR FIELD p_rb1.
  PARAMETERS: p_rb1 RADIOBUTTON GROUP grp DEFAULT 'X' USER-COMMAND rb.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
  SELECTION-SCREEN COMMENT (9) lbl3 FOR FIELD p_rb2.
  PARAMETERS: p_rb2 RADIOBUTTON GROUP grp.
SELECTION-SCREEN END OF LINE.

INITIALIZATION.
  lbl1 = 'Name:'.
  lbl2 = '  An:'.
  lbl3 = ' Aus:'.

AT SELECTION-SCREEN OUTPUT.
* Elemente des Selektionsbiles durchgehen
  LOOP AT SCREEN INTO DATA(wa).
* Wenn Element 'SO_TEST'
    IF wa-group1 = '100'.
* Aktvsetzung in Abhängigkeit von RB2
      wa-active = COND #( WHEN p_rb2 = abap_true THEN 0 ELSE 1 ).
      MODIFY SCREEN FROM wa.
    ENDIF.
  ENDLOOP.

[ABAP] Transportauftrag als ZIP-Datei speichern

SELECTION-SCREEN BEGIN OF LINE.
  SELECTION-SCREEN COMMENT (20) lbl1 FOR FIELD p_trkorr.
  PARAMETERS: p_trkorr LIKE e070-trkorr OBLIGATORY.
SELECTION-SCREEN END OF LINE.

INITIALIZATION.

  lbl1 = 'Transport-Auftrag:'.

START-OF-SELECTION.
  TRY.
      DATA: lv_req TYPE trwbo_request.

* (Nach-)Lesen von Einzelbestandteilen eines Auftrags
      CALL FUNCTION 'TR_READ_REQUEST'
        EXPORTING
          iv_read_e070     = abap_true
          iv_read_e07t     = abap_true
          iv_trkorr        = p_trkorr
        CHANGING
          cs_request       = lv_req
        EXCEPTIONS
          error_occured    = 1
          no_authorization = 2
          OTHERS           = 3.

      IF sy-subrc = 0.
*D Änderbar
*L Änderbar, geschützt
*O Freigabe gestartet
*R Freigegeben
*N Freigegeben (Importschutz für reparierte Objekte aktiv)
        IF lv_req-h-trstatus = 'R'.

          DATA: lv_trans_cofile_dir TYPE stpa-file.
          DATA: lv_trans_data_dir TYPE stpa-file.

* intern: Pfade der Transportverzeichnisse
          CALL FUNCTION 'TRINT_FI_GET_DIRECTORY_NAMES'
            EXPORTING
              iv_dir_type          = 'T'
            IMPORTING
              ev_data_dir          = lv_trans_data_dir
              ev_cofiles_dir       = lv_trans_cofile_dir
            EXCEPTIONS
              get_dir_trans_failed = 1
              build_path_failed    = 2
              OTHERS               = 3.

          IF sy-subrc = 0.
* Name
            DATA(lv_syst) = |{ p_trkorr(3) }|.
            DATA(lv_num) = |{ p_trkorr+4 }|.
            DATA(lv_name) = |{ lv_num }.{ lv_syst }|.

* Cofile lesen
            DATA: lv_xstr_cofile TYPE xstring.
            DATA(lv_cofile) = |{ lv_trans_cofile_dir }/K{ lv_name }|.

            OPEN DATASET lv_cofile FOR INPUT IN BINARY MODE.
            READ DATASET lv_cofile INTO lv_xstr_cofile.
            CLOSE DATASET lv_cofile.

* Data lesen
            DATA: lv_xstr_data TYPE xstring.
            DATA(lv_data) = |{ lv_trans_data_dir }/R{ lv_name }|.

            OPEN DATASET lv_data FOR INPUT IN BINARY MODE.
            READ DATASET lv_data INTO lv_xstr_data.
            CLOSE DATASET lv_data.

* Zip
            DATA(o_zip) = NEW cl_abap_zip( ).

            o_zip->add( name    = |K{ lv_name }|
                        content = lv_xstr_cofile ).

            o_zip->add( name    = |R{ lv_name }|
                        content = lv_xstr_data ).

            DATA(lv_xstr_zip) = o_zip->save( ).

* SOLIX
            DATA(it_raw_data) = cl_bcs_convert=>xstring_to_solix( EXPORTING iv_xstring = lv_xstr_zip ).

            DATA: lv_action TYPE i.
            DATA: lv_filename TYPE string.
            DATA: lv_fullpath TYPE string.
            DATA: lv_path TYPE string.

            DATA(lv_default) = |{ lv_req-h-as4text }_{ p_trkorr }|.

* alle Vorkommen, die nicht [a-zA-Z0-9_] entsprechen, durch '_' ersetzen
            REPLACE ALL OCCURRENCES OF REGEX '[^\w]+' IN lv_default WITH '_'.

* Save-Dialog
            cl_gui_frontend_services=>file_save_dialog( EXPORTING default_file_name = lv_default
                                                                  default_extension = 'zip'
                                                                  file_filter       = |{ cl_gui_frontend_services=>filetype_all }|
                                                        CHANGING  filename          = lv_filename
                                                                  path              = lv_path
                                                                  fullpath          = lv_fullpath
                                                                  user_action       = lv_action ).

            IF lv_action EQ cl_gui_frontend_services=>action_ok.

* Datei lokal speichern
              cl_gui_frontend_services=>gui_download( EXPORTING filename     = lv_fullpath
                                                                filetype     = 'BIN'
                                                                bin_filesize = xstrlen( lv_xstr_zip )
                                                      CHANGING  data_tab     = it_raw_data ).
            ENDIF.

          ELSE.
            WRITE: / |Systemverzeichnisse nicht gefunden.|.
          ENDIF.
        ELSE.
          WRITE: / |Auftrag { p_trkorr } nicht frei gegeben.|.
        ENDIF.

      ELSE.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO DATA(lv_msg).
        WRITE: / lv_msg.
      ENDIF.
    CATCH cx_root INTO DATA(e_txt).
      WRITE: / e_txt->get_text( ).
  ENDTRY.

[ABAP] Objektliste zu Transportauftrag lesen

SELECTION-SCREEN BEGIN OF LINE.
  SELECTION-SCREEN COMMENT (20) lbl1 FOR FIELD p_trkorr.
  PARAMETERS: p_trkorr LIKE e070-trkorr OBLIGATORY.
SELECTION-SCREEN END OF LINE.

INITIALIZATION.

  lbl1 = 'Transport-Auftrag:'.

START-OF-SELECTION.
  DATA(lv_req) = VALUE trwbo_request_header( trkorr = p_trkorr ).
  DATA: it_objects TYPE scit_e071.
  DATA: it_keys	TYPE tr_keys.
  DATA: it_keys_str TYPE e071k_strtyp.

* erstellt Gesamt-Objektliste eines Auftrags und seiner Aufgaben
  CALL FUNCTION 'TR_GET_OBJECTS_OF_REQ_AN_TASKS'
    EXPORTING
      is_request_header      = lv_req
      iv_condense_objectlist = abap_true
    IMPORTING
      et_objects             = it_objects
      et_keys                = it_keys
      et_keys_str            = it_keys_str
    EXCEPTIONS
      invalid_input          = 1
      OTHERS                 = 2.

  IF sy-subrc = 0.
    cl_demo_output=>write_data( p_trkorr ).
    cl_demo_output=>write_data( it_objects ).
    cl_demo_output=>write_data( it_keys ).
    cl_demo_output=>write_data( it_keys_str ).

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

* cl_gui_container=>default_screen erzwingen
    WRITE: space.
  ELSE.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO DATA(lv_msg).
    WRITE: / lv_msg.
  ENDIF.