[ABAP] F4-Hilfe für Transportaufträge und Transportaufgaben

* Siehe Typgruppe SCTSC (Konstanten CTS)
DATA: lv_tkorr TYPE e070-trkorr.
DATA: lv_korr_head TYPE trwbo_request_header.

* F4-Hilfe für Aufträge/Aufgaben
CALL FUNCTION 'TR_F4_REQUESTS'
  EXPORTING
    iv_username             = sy-uname
    iv_client               = sy-mandt
    iv_trfunctions          = 'KW'     "TRFUNCTION: Workbench - K, Customizing - W"
    iv_trstatus             = 'DLRO'   "TRSTATUS: Änderbar - D, Geschützt - L, Freigabe gestartet - O, Freigegeben - R"
    iv_via_selection_screen = abap_true
    iv_complete_requests    = abap_true
  IMPORTING
    ev_selected_request     = lv_tkorr
    es_selected_request     = lv_korr_head.

cl_demo_output=>write_data( lv_tkorr ).
cl_demo_output=>write_data( lv_korr_head ).
cl_demo_output=>display( ).

[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] Auswahl eines Transportauftrags (mit Anlegen)

* 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/

* 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

* Auftragstyp
SELECTION-SCREEN BEGIN OF LINE.
  SELECTION-SCREEN COMMENT (14) lbl1 FOR FIELD p_tfunc.
  PARAMETERS: p_tfunc TYPE trfunction.
SELECTION-SCREEN END OF LINE.

INITIALIZATION.
  lbl1 = 'Auftragstyp:'.

START-OF-SELECTION.

  DATA: lv_req TYPE trwbo_request_header.

* Auswahl eines Transportauftrags (mit Anlegen)
  CALL FUNCTION 'TR_REQUEST_CHOICE'
    EXPORTING
      iv_request_types     = p_tfunc
    IMPORTING
      es_request           = lv_req
    EXCEPTIONS
      invalid_request      = 1
      invalid_request_type = 2
      user_not_owner       = 3
      no_objects_appended  = 4
      enqueue_error        = 5
      cancelled_by_user    = 6
      recursive_call       = 7
      OTHERS               = 8.

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