[ABAP] IMG-Aktivität (Customizing-Punkt) zu einer Transaktion ermitteln

* Tabellen:
*  CUS_ACTEXT (Customizing Aktivität - zugeordnetes Erweiterungs-Objekt)
*  CUS_ACTH   (Customizing Aktivität - Kopfdaten)
*  CUS_ACTOBJ (Customizing Aktivität - Liste der Objekte)
*  CUS_ACTOBT (Customizing Aktivität - Liste der Objekte)
*  CUS_ACTT   (Texttabelle zu den Customizing Aktivitäten)

* TCode
PARAMETERS: p_tc TYPE tstc-tcode DEFAULT 'OMBT'.

START-OF-SELECTION.

  SELECT o~tcode,
         o~act_id,
         o~objectname,
         o~text AS etext,
         t~text,
         e~exit_name,
         e~impl_name,
         e~enhancement
    INTO TABLE @DATA(it_activities)
    FROM cus_actobt AS o
    INNER JOIN cus_acth AS h ON o~act_id = h~act_id
    INNER JOIN cus_actt AS t ON h~act_id = t~act_id
    LEFT OUTER JOIN cus_actext AS e ON o~act_id = e~act_id
    WHERE o~tcode = @p_tc
      AND o~spras = @sy-langu
      AND t~spras = @sy-langu.

  TRY.
* SALV-Table
      DATA: o_salv TYPE REF TO cl_salv_table.

      cl_salv_table=>factory( IMPORTING
                                r_salv_table   = o_salv
                              CHANGING
                                t_table        = it_activities ).

* Grundeinstellungen
      o_salv->get_functions( )->set_all( abap_true ).
      o_salv->get_columns( )->set_optimize( abap_true ).
      o_salv->get_display_settings( )->set_list_header( 'IMG-Aktivitäten zur Transaktion' ).
      o_salv->get_display_settings( )->set_striped_pattern( abap_true ).
      o_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ).

* Spaltenüberschriften: technischer Name und Beschreibungstexte
      LOOP AT o_salv->get_columns( )->get( ) ASSIGNING FIELD-SYMBOL(<c>).
        DATA(o_col) = <c>-r_column.
        o_col->set_short_text( || ).
        o_col->set_medium_text( || ).
        o_col->set_long_text( |{ o_col->get_columnname( ) } [{ o_col->get_long_text( ) }]| ).
      ENDLOOP.

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

[ABAP] API-Klasse mit Ersatzfunktionen für eingeschränkte ABAP-Funktionalität in der SAP S/4HANA Cloud-Umgebung

* Verfügbar für SAP S/4HANA Cloud
* SY-DATUM
DATA(lv_sy_datum) = cl_abap_context_info=>get_system_date( ).
* SY-UZEIT
DATA(lv_sy_uzeit) = cl_abap_context_info=>get_system_time( ).
* SY-UNAME
DATA(lv_sy_uname) = cl_abap_context_info=>get_user_technical_name( ).
* Username
DATA(lv_user_name) = cl_abap_context_info=>get_user_formatted_name( ).
* User Description
DATA(lv_user_desc) = cl_abap_context_info=>get_user_description( ).
* SY-LANGU
DATA(lv_sy_langu) = cl_abap_context_info=>get_user_language_abap_format( ).
* ISO-Language
DATA(lv_langu_iso) = cl_abap_context_info=>get_user_language_iso_format( ).
* SY-ZONLO
DATA(lv_sy_zonlo) = cl_abap_context_info=>get_user_time_zone( ).
* System URL
DATA(lv_system_url) = cl_abap_context_info=>get_system_url( ).
* User Business Partner ID
DATA(lv_user_bpid) = cl_abap_context_info=>get_user_business_partner_id( ).

[ABAP] Archivierte Objekte lesen

*  Beispiele:
*
*  https://www.abapforum.com/forum/viewtopic.php?t=1196
*  https://copycodesap.wordpress.com/2014/10/27/custom-table-archival-read-program/
*
*  Transaktion:
*    ALO1 (Ermitteln Verknüpfungen ASH/DOREX)
*
*  Reports:
*    SBOOKR
*    SBOOKR_2
*    SBOOKR_3
*    RDRBFI00
*
*  Paket: SARC
*  Funktionsgruppe: ARCH
*
*  Funktionsbausteine:
*
*    ARCHIVE_CLOSE_FILE (Offene Archivdateien werden geschlossen)
*    ARCHIVE_GET_CUSTOMIZING_DATA (Customizing-Daten eines Archivierungsobjektes lesen)
*    ARCHIVE_GET_INFORMATION (Archivobjekt-Informationen werden aufgrund eines Handles übergeben)
*    ARCHIVE_GET_NEXT_OBJECT (Datenobjekt aus der Archivdatei lesen)
*    ARCHIVE_GET_NEXT_RECORD (Sequentielles Lesen der Sätze aus einem Datenobjekt)
*    ARCHIVE_GET_STATISTICS (Übernahme der vom ADK gesammelten Statistikdaten)
*    ARCHIVE_GET_TABLE (Sätze strukturgerecht aus aktuellem Datenobjekt lesen)
*    ARCHIVE_GIVE_STATISTICS (Übergabe von Statistikdaten in Programmen der Datenarchivierung)
*    ARCHIVE_NEW_OBJECT (Datenobjekt zum Schreiben anfordern)
*    ARCHIVE_OPEN_FOR_DELETE (Archivdatei öffnen zum Löschen der Sätze in der Datenbank)
*    ARCHIVE_OPEN_FOR_MOVE (Datenobjekte in eine neue Archivdatei schreiben und/oder zurückladen)
*    ARCHIVE_OPEN_FOR_READ (Öffnen einer vorhandenen Archivdatei zum Lesen)
*    ARCHIVE_OPEN_FOR_WRITE (Archivdatei zum Schreiben öffnen)
*    ARCHIVE_PUT_RECORD (Datensatz in Datenobjekt schreiben)
*    ARCHIVE_PUT_TABLE (Sätze strukturgerecht in aktuelles Datenobjekt stellen)
*    ARCHIVE_READ_OBJECT (Lesen eines Datenobjektes aus einer Archivdatei)
*    ARCHIVE_SAVE_OBJECT (Datenobjekt in die Archivdatei schreiben)
*    ARCHIVE_WRITE_STATISTICS (Ausgabe der vom ADK gesammelten Statistikdaten (Standardprotokoll))
*
*  Paket: SWW
*  Funktionsgruppe: SWWX
*
*  Funktionsbausteine:
*
*    WORKITEM_ARCHIVE_GET_TABLE (Lesen von archivierten Workitems)
*    WORKITEM_ARCHIVE_OBJECT (Archivierungsklasse WORKITEM: Schreiben eines Workitems in ein Archiv)
*    WORKITEM_ARCHIVE_PUT_TABLE (Übergabe konvertierter Daten an das ADK)
*    WORKITEM_READ_ARCHIVE_OBJ (Archivierungsklasse WORKITEM: Lesen von Workitems aus dem Archiv)
*
*  Tabellen:
*
*    ARCH_OBJ (Objekte für die Archivierung und Reorganisation)
*    ARCH_TXT (Bezeichnung der Archivierungsobjekte)
*    ARCH_DEF (Definition eines Archivierungsobjekts)
*    ADMI_RUN (Archivierungsläufe Kopfdaten)
*    ADMI_FILES (Archivdateien der Archivierungsläufe)
*    PATH (Definition der physischen Dateipfade je Syntax)
*    FILENAME (Umsetztabelle von internen Dateinamen in externe Dateinamen)
*    FILESYS (Definition der Gruppen der Dateibeschreibungssyntax)
*    FSYSTXT (Bezeichnung der Dateibeschreibungssyntax)
*    FILENAMECI (Plattformunabhängige Dateinamen, mandantenübergreifend)
*    FILEPATH (Definition der logischen Dateipfade)
*    PATHTEXT (Bezeichnung der logischen Dateipfade)
*
*  Customizing Dateipfade:
*
*  Transaktion FILE
*  oder
*  SPRO -> SAP NetWeaver -> Application Server -> Systemadministration -> Plattformunabhängige Dateinamen -> Dateinamen und Dateipfade mandantenunabhängig pflegen

* Archivierungsobjekt
PARAMETERS: p_obj TYPE arch_def-object DEFAULT 'CHANGEDOCU'.

DATA(lv_handle) = VALUE sy-tabix( ).
DATA: it_archive_files TYPE STANDARD TABLE OF rng_archiv WITH DEFAULT KEY.
DATA: it_selected_files TYPE STANDARD TABLE OF admi_files WITH DEFAULT KEY.

* Öffnen einer vorhandenen Archivdatei zum Lesen
* wenn nur ein Wert für "object" angegeben wurde, dann erscheint ein Auswahl-Popup
CALL FUNCTION 'ARCHIVE_OPEN_FOR_READ'
  EXPORTING
*   archive_document             = '000000'
*   ARCHIVE_NAME                 = ' '
    object                       = p_obj
*   MAINTAIN_INDEX               = ' '
  IMPORTING
    archive_handle               = lv_handle
  TABLES
    archive_files                = it_archive_files
    selected_files               = it_selected_files
  EXCEPTIONS
    file_already_open            = 1
    file_io_error                = 2
    internal_error               = 3
    no_files_available           = 4
    object_not_found             = 5
    open_error                   = 6
    not_authorized               = 7
    archiving_standard_violation = 8
    OTHERS                       = 9.

IF sy-subrc = 0.
* Testweise den externen Speicherpfad im UNIX-Dateisystem ermitteln
  LOOP AT it_selected_files ASSIGNING FIELD-SYMBOL(<f>).
    SELECT SINGLE pathextern
      INTO @DATA(lv_pathextern)
      FROM path
      WHERE pathintern = @<f>-pathintern
        AND filesys = 'UNIX'.

    WRITE: / <f>-document, <f>-archiv_key, <f>-pathintern, lv_pathextern.
  ENDLOOP.

  ULINE.

  DO.
* Datenobjekt aus der Archivdatei lesen
    CALL FUNCTION 'ARCHIVE_GET_NEXT_OBJECT'
      EXPORTING
        archive_handle          = lv_handle
*         IMPORTING
*       OBJECT_ID               =
*       OBJECT_OFFSET           =
*       ARCHIVE_NAME            =
*       COMPR_OBJECT_LENGTH     =
*       SESSION                 =
*       EV_CONTAIN_BLOCKED_DATA =
      EXCEPTIONS
        end_of_file             = 1
        file_io_error           = 2
        internal_error          = 3
        open_error              = 4
        wrong_access_to_archive = 5
        OTHERS                  = 6.

    IF sy-subrc <> 0.
* Keine Objekte mehr
      EXIT.
    ELSE.
      DO.
        DATA(lv_data_struct) = VALUE arc_buffer-rname( ).
* Datenreferenz -> Unicodefähigkeit
        DATA: o_data_ref TYPE REF TO data.

* Sequentielles Lesen der Sätze aus einem Datenobjekt
        CALL FUNCTION 'ARCHIVE_GET_NEXT_RECORD'
          EXPORTING
            archive_handle   = lv_handle
          IMPORTING
            record_structure = lv_data_struct
            record_ref       = o_data_ref
          EXCEPTIONS
            end_of_object    = 1
            OTHERS           = 2.

        IF sy-subrc <> 0.
* Keine Daten mehr
          EXIT.
        ELSE.
* Farbe definieren
          FORMAT COLOR COL_HEADING.
* Ausgabetext
          WRITE: / 'Struktur:', to_upper( lv_data_struct ).
* Leerzeichen am Zeilenende, damit der Farbbalken durchgezogen wird
          WRITE AT sy-linsz space.
* Farbdefinition abschalten
          FORMAT COLOR OFF.

* Generische Datenausgabe
* Strukturbeschreibung der akt. Archivstruktur
          DATA(o_desc) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_name( lv_data_struct ) ).
* Komponenten
          DATA(gt_comp) = o_desc->get_components( ).
* generische Objekte für Zugriff
          FIELD-SYMBOLS: <row> TYPE any.
          ASSIGN o_data_ref->* TO <row>.

          DATA(lv_head) = ||.
          DATA(lv_data) = ||.

* Alle Felder der Struktur durchloopen
          LOOP AT gt_comp ASSIGNING FIELD-SYMBOL(<c>).
* Spaltenbreite
            DATA(lv_width) = strlen( <c>-name ).

* Prüfen, ob DDIC-Typ
            DATA(o_edesc) = CAST cl_abap_elemdescr( <c>-type ).
            IF o_edesc->is_ddic_type( ) EQ abap_true.
* Feld anhand des Komponentennamens aus der Struktur ermitteln und Feldsymbol zuweisen
              ASSIGN COMPONENT <c>-name OF STRUCTURE <row> TO FIELD-SYMBOL(<cell>).
              IF <cell> IS ASSIGNED.
* Spaltenbreite, falls Zellinhalt breiter
                IF strlen( condense( <cell> ) ) > lv_width.
                  lv_width = strlen( condense( <cell> ) ).
                ENDIF.

* Formatierung Daten
                lv_data = COND #( WHEN lv_data IS INITIAL THEN |{ condense( <cell> ) WIDTH = lv_width }| ELSE |{ lv_data }\|{ condense( <cell> ) WIDTH = lv_width }| ).
              ENDIF.
            ENDIF.

* Formatierung Kopf
            lv_head = COND #( WHEN lv_head IS INITIAL THEN |{ <c>-name WIDTH = lv_width }| ELSE |{ lv_head }\|{ <c>-name WIDTH = lv_width }| ).

          ENDLOOP.

* Ausgabe
          WRITE: / lv_head.
          WRITE: / lv_data.

          ULINE.
        ENDIF.

      ENDDO.
    ENDIF.
  ENDDO.

* Offene Archivdateien werden geschlossen
  CALL FUNCTION 'ARCHIVE_CLOSE_FILE'
    EXPORTING
      archive_handle = lv_handle.

ENDIF.

[ABAP] Inhalt eines Dynpros lesen

* Inhalte und Positionen aller Dynprofelder
DATA: it_dynpro_list TYPE STANDARD TABLE OF dynp_list WITH DEFAULT KEY.
* Tabelle mit verwendeten Include-Dynpros
DATA: it_include_dynpro_info TYPE STANDARD TABLE OF incl_dynps WITH DEFAULT KEY.

* Erzeugt Liste mit Positionen und Inhalten aller Einträge eines Dynpros
CALL FUNCTION 'GET_DYNPRO_LIST'
  EXPORTING
    dyname                     = 'SAPLSD_ENTRY' " Name des ABAP/4-Programms (SE11)"
    dynumb                     = '1000'         " Nummer des auszugebenden Dynpros"
*   INCL_COLUMN                = 0
*   INCL_LINE                  = 0
*   INCL_WIDTH                 = 0
*   INCL_HEIGHT                = 0
*   PROCESS_ACTUAL_DYNPRO      = 'X'
  TABLES
    dynpro_list                = it_dynpro_list
    include_dynpro_info        = it_include_dynpro_info
  EXCEPTIONS
    no_such_dynpro             = 1
    no_include_dynpro_infos    = 2
    wrong_include_dynpro_infos = 3
    OTHERS                     = 4.

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

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

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

[ABAP] Quellcode Scan / Analyse

* https://blogs.sap.com/2019/04/22/how-to-scan-abap-code/

PARAMETERS: p_prog TYPE trdir-name DEFAULT 'SAPLSD_ENTRY'. " (SE11)

START-OF-SELECTION.

* Code Inspector: Quelltext für Include
  DATA(o_si) = cl_ci_source_include=>create( p_name = p_prog ).
* Code Inspector: Quelltext für SCAN  erzeugen
  DATA(o_scan) = NEW cl_ci_scan( p_include = o_si ).

* Include-Zeilen
  cl_demo_output=>write_data( o_si->lines ).
* Tokens
  cl_demo_output=>write_data( o_scan->tokens ).
* Anweisungen
  cl_demo_output=>write_data( o_scan->statements ).

* Verknüpfung Statements -> Tokens
* Statements
  LOOP AT o_scan->statements ASSIGNING FIELD-SYMBOL(<s>).

    DATA(idx) = sy-tabix.

* Tokens
    LOOP AT o_scan->tokens ASSIGNING FIELD-SYMBOL(<t>) FROM <s>-from TO <s>-to.
      cl_demo_output=>write_data( value = <t>-str name = |Statement { idx }| ).
    ENDLOOP.

    cl_demo_output=>line( ).

  ENDLOOP.

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

*   cl_gui_container=>default_screen erzwingen
  WRITE: space.

[ABAP] ITS: HTML aus einem Dynpro generieren

* Paket: SITS_ABAP

* SE11 - Report
DATA: lv_prog TYPE d020s-prog VALUE 'SAPLSD_ENTRY'.
* Dynpro 1000
DATA: lv_dynnr TYPE d020s-dnum VALUE '1000'.
* '' / C - Classic, B - HTML-Business, W - WebGUI
DATA: lv_style TYPE w3style VALUE 'B'.

DATA: lv_html_xstr TYPE xstring.
DATA: it_html TYPE STANDARD TABLE OF w3html WITH DEFAULT KEY.

* Template von Dynpro generieren
CALL FUNCTION 'ITS_GENERATE_HTML_FROM_DYNPRO'
  EXPORTING
    progname                       = lv_prog
    dynnr                          = lv_dynnr
    style_2006                     = lv_style
  IMPORTING
    source_stream                  = lv_html_xstr
  TABLES
    meta_html                      = it_html
  EXCEPTIONS
    style_not_valid                = 1
    dynnr_or_programname_not_valid = 2
    css_not_valid                  = 3
    xsl_not_valid                  = 4
    placeholder_not_valid          = 5
    no_card_identifiers_used       = 6
    error_occured                  = 7
    OTHERS                         = 8.

IF sy-subrc = 0.
  cl_demo_output=>write_data( it_html ).
  DATA(lv_html) = cl_demo_output=>get( ).

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

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

[ABAP] Systeminfos anzeigen

* Name des R/3-Systems
DATA: lv_sy_sysid TYPE sy-sysid.
* Name des zentralen Datenbanksystems
DATA: lv_sy_dbsys TYPE sy-dbsys.
* Betriebssystem des Applikationsservers
DATA: lv_sy_opsys TYPE sy-opsys.
* Anmeldename des Benutzers
DATA: lv_sy_uname TYPE sy-uname.
* Release-Stand des R/3-Systems
DATA: lv_sy_saprl TYPE sy-saprl.
* Installationsnummer
DATA: lv_ev_inst_no TYPE cmorfcoth-instno.
* Releasestände der im System vorhandenen Softwarekomponenten
DATA: it_et_cvers TYPE STANDARD TABLE OF cvers WITH DEFAULT KEY.

* Holt Systeminfos
CALL FUNCTION 'SCSI_GET_SYSTEM_INFO'
  IMPORTING
    sy_sysid   = lv_sy_sysid
    sy_dbsys   = lv_sy_dbsys
    sy_opsys   = lv_sy_opsys
    sy_uname   = lv_sy_uname
    sy_saprl   = lv_sy_saprl
    ev_inst_no = lv_ev_inst_no
  TABLES
    et_cvers   = it_et_cvers.

cl_demo_output=>write_data( lv_sy_sysid ).
cl_demo_output=>write_data( lv_sy_dbsys ).
cl_demo_output=>write_data( lv_sy_opsys ).
cl_demo_output=>write_data( lv_sy_uname ).
cl_demo_output=>write_data( lv_sy_saprl ).
cl_demo_output=>write_data( lv_ev_inst_no ).
cl_demo_output=>write_data( it_et_cvers ).

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

* cl_gui_container=>default_screen erzwingen
WRITE: space.

[ABAP] Informationen zu einem Dynpro lesen

* Dynproheaderstruktur
DATA: lv_header LIKE d020s.
* Dynprofeldtabelle
DATA: it_ftab TYPE STANDARD TABLE OF d021s WITH DEFAULT KEY.
* Tabelle für Dynproablauflogik
DATA: it_pltab TYPE STANDARD TABLE OF d022s WITH DEFAULT KEY.

* Dynproloadinformationen mit ABAP-Mitteln
* request:
*  - 'A' - Dynproheader u. Felder
*  - 'F' - Dynprofelder
*  - 'C' - Dynproablauflogik
*  - 'G' - Generiere
*  - 'H' - Dynproheader
*  - 'T' - Testharms
CALL FUNCTION 'RS_IMPORT_DYNPRO'
  EXPORTING
    dylang               = sy-langu       " Dynprogenerierungssprache
    dyname               = 'SAPLSD_ENTRY' " Name des Dynpros (SE11)
    dynumb               = '1000'         " Nummer des Dynpros
    suppress_checks      = abap_true
*    request              = 'A'
  IMPORTING
    header               = lv_header
  TABLES
    ftab                 = it_ftab
    pltab                = it_pltab
  EXCEPTIONS
    button_error         = 1
    dylanguage_invalid   = 2
    dylanguage_not_inst  = 3
    dyname_invalid       = 4
    dynproload_not_found = 5
    dynpro_old           = 6
    dynumb_invalid       = 7
    ftab_invalid         = 8
    gen_error            = 9
    gen_ok               = 10
    header_invalid       = 11
    internal_error       = 12
    no_dynpro            = 13
    no_ftab_row          = 14
    no_memory            = 15
    no_processlogic      = 16
    pltab_invalid        = 17
    request_invalid      = 18
    OTHERS               = 19.

IF sy-subrc = 0.
  cl_demo_output=>write_data( lv_header ).
  cl_demo_output=>write_data( it_ftab ).
  cl_demo_output=>write_data( it_pltab ).

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

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

[ABAP] Abhängige Objekte in Transportaufträgen ermitteln

* Der Report sucht nach Objektabhängigkeiten in Transportaufträgen

* Tabellen:
*  E070 (Transportsystem: Header von Aufträgen/Aufgaben)
*  E07T (Transportsystem: Kurzbeschreibungen von Aufträgen/Aufgaben)
*  E070C (Transportsystem: Quell-/Zielmandant von Aufträgen/Aufgaben)
*  E071 (Transportsystem: Objekt-Einträge von Aufträgen/Aufgaben)
*  TADIR (Katalog der Repository-Objekte)
*  TPLOG (Logging der tp Aufrufe)

* https://www.berater-wiki.de/Transportauftrag
* https://www.berater-wiki.de/Access_Tabellenbeziehung_Transportauftrag/-Aufgabe
* http://sapyourself.com/2014/06/11/transporte-transporteur-ermitteln-und-analysieren-tabelle-tplog/

PARAMETERS: p_tr TYPE e070-trkorr DEFAULT 'XYZ'.

START-OF-SELECTION.

* TRFUNCTION
*  K  Workbench-Auftrag
*  W  Customizing-Auftrag
*  C  Umzug von Objekten ohne Paketwechsel
*  O  Umzug von Objekten mit Paketwechsel
*  E  Umzug eines kompletten Pakets
*  T  Transport von Kopien
*  S  Entwicklung/Korrektur
*  R  Reparatur
*  X  Unklassifizierte Aufgabe
*  Q  Customizing-Aufgabe
*  G  Stückliste für CTS-Projekt
*  M  Auftrag für Mandantentransport
*  P  Stückliste für Upgrade
*  D  Stückliste für Patch
*  F  Stückliste
*  L  Löschtransport
* TRSTATUS
*  D  Änderbar
*  L  Änderbar, geschützt
*  O  Freigabe gestartet
*  R  Freigegeben
*  N  Freigegeben (Importschutz für reparierte Objekte aktiv)
* KORRDEV
*  CUST  mandantenabhängiges Customizing
*  SYST  Repository, mandantenunabbhängige Objekte
* LOCKFLAG
*     nicht gesperrt
*  X  gesperrt
*  0  nicht importiert
*  1  importiert mit Fehler
*  2  erfolgreich importiert
*  3  erfolgreich aktiviert /After-Import-Methode ausgeführt
*  6  erfolgreich in Schattentabellen importiert
*  7  erfolgreich in neue Schattentabellen importiert
*  8  inaktiver Anteil erfolgreich importiert
  SELECT e~trkorr,      " Auftrag/Aufgabe
         e~trfunction,  " Typ des Auftrags/Aufgabe
         e~trstatus,    " Status des Auftrags/der Aufgabe
         e~tarsystem,   " Transportziel eines Auftrags
         e~korrdev,     " Kategorie des Auftrags/der Aufgabe
         e~as4user,     " Inhaber eines Auftrags oder einer Aufgabe
         e~as4date,     " Datum der letzten Änderung
         e~as4time,     " Uhrzeit der letzten Änderung
         e~strkorr,     " Übergeordneter Auftrag
         t~as4text,     " Kurzbeschreibung von Repository-Objekten
         c~client,      " Quellmandant eines Auftrags
         c~tarclient,   " Zielmandant eines Auftrags
         o~as4pos,      " Dictionary: Zeilenposition
         o~pgmid,       " Programm-ID in Aufträgen und Aufgaben
         o~object,      " Objekttyp
         o~obj_name,    " Objektname in der Objektliste
         o~objfunc,     " Objektfunktion
         o~lockflag,    " Sperrstatus oder Importstatus zu einem Objekteintrag
         o~activity     " Aktivität, mit der Eintrag in Objektliste geschrieben wurde
    INTO TABLE @DATA(it_e070)
    FROM e070 AS e                                    " Transportsystem: Header von Aufträgen/Aufgaben
    INNER JOIN e07t AS t ON e~trkorr = t~trkorr       " Transportsystem: Kurzbeschreibungen von Aufträgen/Aufgaben
    INNER JOIN e070c AS c ON e~trkorr = c~trkorr      " Transportsystem: Quell-/Zielmandant von Aufträgen/Aufgaben
    LEFT OUTER JOIN e071 AS o ON e~trkorr = o~trkorr  " Transportsystem: Objekt-Einträge von Aufträgen/Aufgaben
    WHERE e~trkorr  = @p_tr
       OR e~strkorr = @p_tr
      AND t~langu   = @sy-langu.

  IF sy-subrc = 0.
* sortieren nach Auftrag und Datum / Uhrzeit
    SORT: it_e070 BY trkorr as4date as4time.

    SELECT *
      INTO TABLE @DATA(it_e071)
      FROM e071
      FOR ALL ENTRIES IN @it_e070
      WHERE object   = @it_e070-object
        AND obj_name = @it_e070-obj_name
        AND objfunc  = @it_e070-objfunc.

    IF sy-subrc = 0.

      DATA: o_salv TYPE REF TO cl_salv_table.

      cl_salv_table=>factory( EXPORTING
                                r_container  = cl_gui_container=>default_screen
                              IMPORTING
                                r_salv_table = o_salv
                              CHANGING
                                t_table      = it_e071 ).

      o_salv->get_functions( )->set_all( abap_true ).
      o_salv->get_columns( )->set_optimize( abap_true ).
      o_salv->get_display_settings( )->set_list_header( 'Abhängige Transporte / Aufgaben' ).
      o_salv->get_display_settings( )->set_striped_pattern( abap_true ).
      o_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ).

      LOOP AT o_salv->get_columns( )->get( ) ASSIGNING FIELD-SYMBOL(<c>).
        <c>-r_column->set_short_text( '' ).
        <c>-r_column->set_medium_text( '' ).
        <c>-r_column->set_long_text( |{ <c>-r_column->get_columnname( ) } [{ <c>-r_column->get_long_text( ) }]| ).
      ENDLOOP.

      o_salv->display( ).

      WRITE: space.

    ENDIF.

  ENDIF.