Part of the EPO Connector comes a report for uploading transport order files onto your SAP server.
Transport files (*.zip) for EPO solutions are available the EPO - NextCloud, Software Download.
This report evaluates the DATA- and COFILES - directory on the server and can write the tranport files directly to the desired folders.
Select the 'upload' checkbox and select the .zip - file.
After running the report (F8) the files are copied onto the SAP server.
As a little help, the number of the transport order will be copied into your clipboard.
If this report is not available, use transaction CG3Z to upload the 'K'- and 'R' file (extracted from the .ZIP) into the transport directory, or ask the SAP basis team in your company for help.
Alternatively, implement and run the mini-transport report (see appendix).
When the cofile and the data file of the transport are existing in the transport folder, you may import the transport into your system.
Open transaction STMS, select the import system and add the transport to the import queue:
Enter the transport number (paste from the clipboard).
Afterwards, the transport can be selected and imported as usual:
In order to transport the imported objects to test- and productive system, create a new transport order:
Transaction SE09 (or SE10), create a new workbench/customizing transport, add the objects of the imported WK1 - transport order:
Release the transport order and transport according Your standard transport rules.
The report /EPO1/TRANSPORT is contained in the SP12 - transport package. In order to make the very first import easier, the following report could be implemented on the development system in a local package (not intended to be transported!) - change the report name to Your needs.
Please note, that the texts for the selection screen are missing (but they are not really necessary).
*&---------------------------------------------------------------------*
*& Report ZEPO_TRANSPORT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZEPO_TRANSPORT.
" upload / download of transport files;
" local files are stored/expected in a single ZIP file
TYPES:
BEGIN OF gty_trans_dir,
data TYPE trfile,
cofiles TYPE trfile,
END OF gty_trans_dir,
gty_zip_file LIKE LINE OF cl_abap_zip=>files.
CONSTANTS:
c_file_filter_zip TYPE string VALUE 'zip|*.zip|all files|*.*'.
DATA:
gs_trans_dir TYPE gty_trans_dir,
gv_error_flag TYPE flag,
gv_server_file_separator TYPE c.
" screen parameters
SELECTION-SCREEN BEGIN OF BLOCK c WITH FRAME TITLE text-t03.
PARAMETERS: p_dir_c TYPE trfile MODIF ID ro,
p_dir_d TYPE trfile MODIF ID ro.
SELECTION-SCREEN END OF BLOCK c.
" upload
SELECTION-SCREEN BEGIN OF BLOCK b WITH FRAME TITLE text-t02.
PARAMETERS: " upload from local file
p_file_u TYPE file_table-filename.
SELECTION-SCREEN END OF BLOCK b.
INITIALIZATION.
" get the STMS transport directories
PERFORM get_trans_dir CHANGING gs_trans_dir.
p_dir_d = gs_trans_dir-data.
p_dir_c = gs_trans_dir-cofiles.
" get the file separator
CASE sy-opsys.
WHEN 'Windows NT'.
gv_server_file_separator = '\'.
WHEN OTHERS.
gv_server_file_separator = '/'.
ENDCASE.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file_u.
" upload - select an (existing) file
DATA:
g_ft TYPE filetable,
g_rc TYPE i.
CLEAR g_ft.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
FILE_FILTER = c_file_filter_zip
CHANGING
file_table = g_ft
rc = g_rc
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5
.
CASE sy-subrc .
WHEN 0. READ TABLE g_ft INTO p_file_u INDEX 1.
ENDCASE.
AT SELECTION-SCREEN OUTPUT.
" set parameters read only
DATA:
ls_screen TYPE screen.
" make parameters read-only
LOOP AT screen INTO ls_screen.
IF ls_screen-group1 = 'RO'.
ls_screen-input = 0.
MODIFY screen FROM ls_screen.
ENDIF.
ENDLOOP.
AT SELECTION-SCREEN.
" check for inputs..
IF p_file_u IS INITIAL.
MESSAGE text-e02 TYPE 'E'.
ENDIF.
START-OF-SELECTION.
DATA:
lv_file_xstring TYPE xstring.
" upload
" from local
PERFORM upload_from_local USING p_file_u
CHANGING lv_file_xstring.
" save server files (from ZIP)
PERFORM save_zip_to_server USING lv_file_xstring
gv_server_file_separator
gs_trans_dir.
*&---------------------------------------------------------------------*
*& Form GET_TRANS_DIR
*&---------------------------------------------------------------------*
* Get the transport directories (on the application server)
*----------------------------------------------------------------------*
FORM GET_TRANS_DIR CHANGING cs_trans_dir TYPE gty_trans_dir.
DATA:
lt_tefi TYPE TABLE OF stmsttefi,
ls_tefi LIKE LINE OF lt_tefi.
CALL FUNCTION 'TMS_TP_CHECK_TRANS_DIR'
TABLES
TT_TEFI = lt_tefi
EXCEPTIONS
PERMISSION_DENIED = 1
GET_DIR_NAMES_FAILED = 2
BUILD_PATH_FAILED = 3
OTHERS = 4
.
IF SY-SUBRC <> 0.
WRITE:
/ 'error when retrieving the transport directory'.
RETURN.
ENDIF.
" read directories
READ TABLE lt_tefi INTO ls_tefi TRANSPORTING path WITH KEY sysnam = sy-sysid
dir = 'data'.
IF sy-subrc = 0.
cs_trans_dir-data = ls_tefi-path.
ENDIF.
READ TABLE lt_tefi INTO ls_tefi TRANSPORTING path WITH KEY dir = 'cofiles'.
IF sy-subrc = 0.
cs_trans_dir-cofiles = ls_tefi-path.
ENDIF.
" supply default parameters in case of errors
IF cs_trans_dir-data IS INITIAL.
cs_trans_dir-data = '/usr/sap/trans/data'.
ENDIF.
IF cs_trans_dir-cofiles IS INITIAL.
cs_trans_dir-cofiles = '/usr/sap/trans/cofiles'.
ENDIF.
ENDFORM. " GET_TRANS_DIR
*&---------------------------------------------------------------------*
*& Form UPLOAD_FROM_LOCAL
*&---------------------------------------------------------------------*
* upload from a local file
*----------------------------------------------------------------------*
FORM UPLOAD_FROM_LOCAL USING p_filename TYPE file_table-filename
CHANGING c_file_xstring TYPE xstring.
DATA:
lv_filename TYPE string,
lv_file_length TYPE i,
lt_data_tab TYPE solix_tab,
lv_symsgv1 TYPE symsg,
lv_symsgv2 TYPE symsg.
" upload the local file
lv_filename = p_filename.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
FILENAME = lv_filename
FILETYPE = 'BIN'
IMPORTING
FILELENGTH = lv_file_length
TABLES
DATA_TAB = lt_data_tab
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_READ_ERROR = 2
NO_BATCH = 3
GUI_REFUSE_FILETRANSFER = 4
INVALID_TYPE = 5
NO_AUTHORITY = 6
UNKNOWN_ERROR = 7
BAD_DATA_FORMAT = 8
HEADER_NOT_ALLOWED = 9
SEPARATOR_NOT_ALLOWED = 10
HEADER_TOO_LONG = 11
UNKNOWN_DP_ERROR = 12
ACCESS_DENIED = 13
DP_OUT_OF_MEMORY = 14
DISK_FULL = 15
DP_TIMEOUT = 16
OTHERS = 17
.
IF SY-SUBRC <> 0.
gv_error_flag = 'X'.
lv_symsgv1 = p_filename.
lv_symsgv2 = sy-subrc.
MESSAGE ID '/EPO1/TRANSPORT' TYPE 'E' NUMBER 004 WITH lv_symsgv1 lv_symsgv2.
RETURN.
ENDIF.
" write some log:
WRITE:
/ text-d06,
/ text-d03, p_filename,
/ text-d04, lv_file_length,
/,
/ sy-uline,
/.
" convert to XSTRING
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
EXPORTING
INPUT_LENGTH = lv_file_length
IMPORTING
BUFFER = c_file_xstring
TABLES
BINARY_TAB = lt_data_tab
EXCEPTIONS
OTHERS = 0 " ignore errors
.
ENDFORM. " UPLOAD_FROM_LOCAL
*&---------------------------------------------------------------------*
*& Form SAVE_ZIP_TO_SERVER
*&---------------------------------------------------------------------*
* Save the contents of the ZIP file to the server
*----------------------------------------------------------------------*
FORM SAVE_ZIP_TO_SERVER USING p_zip_xstring TYPE xstring
p_file_separator TYPE c
ps_trans_dir TYPE gty_trans_dir.
DATA:
lr_zip TYPE REF TO cl_abap_zip,
lv_file TYPE gty_zip_file,
lv_transport TYPE trkorr.
CHECK gv_error_flag IS INITIAL.
" create & fill ZIP
CREATE OBJECT lr_zip.
lr_zip->load(
EXPORTING
zip = p_zip_xstring
EXCEPTIONS
ZIP_PARSE_ERROR = 1
others = 2
).
IF sy-subrc NE 0.
gv_error_flag = 'X'.
MESSAGE ID '/EPO1/TRANSPORT' TYPE 'E' NUMBER 005.
RETURN.
ENDIF.
" save 'K' and 'R'-files to the transport directory
LOOP AT lr_zip->files INTO lv_file.
PERFORM save_file_to_server USING lr_zip
lv_file
p_file_separator
ps_trans_dir
CHANGING lv_transport.
IF gv_error_flag IS NOT INITIAL.
" leave the loop in case of errors
EXIT.
ENDIF.
ENDLOOP.
" copy the transport number
PERFORM copy_number_to_clipboard USING lv_transport.
ENDFORM. " SAVE_ZIP_TO_SERVER
*&---------------------------------------------------------------------*
*& Form SAVE_FILE_TO_SERVER
*&---------------------------------------------------------------------*
* Save a file from the ZIP into the transport directory
*----------------------------------------------------------------------*
FORM SAVE_FILE_TO_SERVER USING pr_zip TYPE REF TO cl_abap_zip
ps_file TYPE gty_zip_file
p_file_separator TYPE c
ps_trans_dir TYPE gty_trans_dir
CHANGING cv_transport TYPE trkorr.
DATA:
lv_file_name TYPE trfile,
lv_full_name TYPE trfile,
lv_file_xstring TYPE xstring,
lv_file_length TYPE i,
lv_symsgv1 TYPE symsg,
lv_symsgv2 TYPE symsg,
lr_root TYPE REF TO cx_root,
lv_question TYPE string,
lv_answer TYPE c.
" check the file name
lv_file_name = ps_file-name.
CASE lv_file_name(1).
WHEN 'K'.
" cofiles.. prepare the file path
lv_full_name = ps_trans_dir-cofiles.
WHEN 'R'.
" data.. prepare the file path
lv_full_name = ps_trans_dir-data.
WHEN OTHERS.
" ignore this file
RETURN.
ENDCASE.
" format the file name
CONCATENATE lv_full_name p_file_separator ps_file-name INTO lv_full_name.
" get the file contents
pr_zip->get(
EXPORTING
name = ps_file-name
IMPORTING
content = lv_file_xstring
EXCEPTIONS
OTHERS = 1 ).
IF sy-subrc NE 0.
gv_error_flag = 'X'.
lv_symsgv1 = ps_file-name.
MESSAGE ID '/EPO1/TRANSPORT' TYPE 'E' NUMBER 006 WITH lv_symsgv1.
RETURN.
ENDIF.
" format the transport-ID
" e.g. K902485.I01
" -> I01K902485
SPLIT ps_file-name AT '.' INTO cv_transport+3 cv_transport(3).
cv_transport+3(1) = 'K'.
" write some log:
lv_file_length = xstrlen( lv_file_xstring ).
WRITE:
/ text-d03, lv_full_name,
/ text-d04, lv_file_length,
/ text-d02, cv_transport,
/.
TRY.
" prepare the error - case
gv_error_flag = 'X'.
lv_symsgv1 = lv_full_name.
" check for an existing file on the server
OPEN DATASET lv_full_name FOR INPUT IN BINARY MODE.
IF sy-subrc = 0.
CLOSE DATASET lv_full_name.
" ask to overwrite
MESSAGE ID '/EPO1/TRANSPORT' TYPE 'I' NUMBER 020 WITH lv_file_name INTO lv_question.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
TITLEBAR = text-p01 " overwrite server file?
TEXT_QUESTION = lv_question
DEFAULT_BUTTON = '2'
DISPLAY_CANCEL_BUTTON = ''
IMPORTING
ANSWER = lv_answer
EXCEPTIONS
TEXT_NOT_FOUND = 1
OTHERS = 2
.
IF ( SY-SUBRC <> 0 ) OR
( lv_answer NE '1' ).
" an error is the same as 'NO'
WRITE:
/ text-p02,
/.
" return without error
CLEAR gv_error_flag.
RETURN.
ENDIF.
ENDIF. " popup for existing server file
" save file to the server
OPEN DATASET lv_full_name FOR OUTPUT IN BINARY MODE.
IF sy-subrc NE 0.
gv_error_flag = 'X'.
lv_symsgv1 = lv_full_name.
MESSAGE ID '/EPO1/TRANSPORT' TYPE 'E' NUMBER 007 WITH lv_symsgv1.
RETURN.
ENDIF.
TRANSFER lv_file_xstring TO lv_full_name.
" clear the error - flag (if there is no exception)
CLEAR gv_error_flag.
CATCH cx_sy_file_authority.
" no authorisation
MESSAGE ID '/EPO1/TRANSPORT' TYPE 'E' NUMBER 008 WITH lv_symsgv1.
CATCH cx_sy_file_io.
" IO-error
MESSAGE ID '/EPO1/TRANSPORT' TYPE 'E' NUMBER 009 WITH lv_symsgv1.
CATCH cx_root INTO lr_root.
" other error
lv_symsgv2 = lr_root->get_text( ).
MESSAGE ID '/EPO1/TRANSPORT' TYPE 'E' NUMBER 010 WITH lv_symsgv1 lv_symsgv2.
ENDTRY.
" close the file
CLOSE DATASET lv_full_name.
ENDFORM. " SAVE_FILE_TO_SERVER
*&---------------------------------------------------------------------*
*& Form COPY_NUMBER_TO_CLIPBOARD
*&---------------------------------------------------------------------*
* Copy the transport number to the clipboard (prepare STMS)
*----------------------------------------------------------------------*
FORM COPY_NUMBER_TO_CLIPBOARD USING pv_transport TYPE trkorr.
DATA:
lt_data LIKE STANDARD TABLE OF pv_transport,
lv_rc TYPE i.
CHECK pv_transport IS NOT INITIAL.
APPEND pv_transport TO lt_data.
cl_gui_frontend_services=>clipboard_export(
IMPORTING
data = lt_data
CHANGING
rc = lv_rc ).
IF lv_rc = 0.
" success - write a message (ignore errors)
WRITE: / text-d15,
/.
ENDIF.
ENDFORM. " COPY_NUMBER_TO_CLIPBOARD