REPORT
Z_ZIP_TOC.
INITIALIZATION
.
SELECTION
-
SCREEN
BEGIN
OF
BLOCK
bl01
WITH
FRAME
TITLE
TEXT-t01.
PARAMETERS
p_trkorr
LIKE
e070-trkorr
OBLIGATORY
.
PARAMETERS
p_ttext
TYPE
as4text.
SELECTION
-
SCREEN
END
OF
BLOCK
bl01.
SELECTION
-
SCREEN
BEGIN
OF
BLOCK
bl02
WITH
FRAME
TITLE
TEXT-t02.
PARAMETERS
p_sapdir
TYPE
string
LOWER
CASE
OBLIGATORY
DEFAULT
'/usr/sap/trans/'
.
PARAMETERS
p_lcldir
TYPE
string
LOWER
CASE
OBLIGATORY
DEFAULT
'C:\temp\'.
SELECTION
-
SCREEN
END
OF
BLOCK
bl02.
AT
SELECTION
-
SCREEN
ON
VALUE
-
REQUEST
FOR
p_trkorr.
CALL
FUNCTION
'TR_F4_REQUESTS'
EXPORTING
iv_trkorr_pattern = p_trkorr
IMPORTING
ev_selected_request = p_trkorr.
START-OF-SELECTION
.
DATA
ls_request
TYPE
trwbo_request.
CALL
FUNCTION
'TR_READ_REQUEST'
EXPORTING
iv_read_e07t =
'X'
iv_trkorr = p_trkorr
CHANGING
cs_request = ls_request
EXCEPTIONS
error_occured = 1
no_authorization = 2
OTHERS
= 3.
IF
sy-subrc
<> 0.
MESSAGE
'Could not read Transport description'
TYPE
'E'
.
ENDIF
.
DATA
: lt_objects
TYPE
tr_objects,
lt_keys
TYPE
tr_keys.
CALL
FUNCTION
'TR_GET_OBJECTS_OF_REQ_AN_TASKS'
EXPORTING
is_request_header =
VALUE
trwbo_request_header( trkorr = p_trkorr )
iv_condense_objectlist =
'X'
IMPORTING
et_objects = lt_objects
et_keys = lt_keys
EXCEPTIONS
invalid_input = 1
OTHERS
= 2.
IF
sy-subrc
<> 0.
MESSAGE
'Could not read Transport objects'
TYPE
'E'
.
ENDIF
.
DATA
ls_request_header
TYPE
trwbo_request_header.
CALL
FUNCTION
'TR_INSERT_REQUEST_WITH_TASKS'
EXPORTING
iv_type =
'T'
iv_text =
COND
as4text(
WHEN
p_ttext
IS
INITIAL
THEN
ls_request-h-as4text
ELSE
p_ttext )
iv_owner =
sy-uname
iv_target =
'DUM'
IMPORTING
es_request_header = ls_request_header
EXCEPTIONS
insert_failed = 1
enqueue_failed = 2
OTHERS
= 3.
IF
sy-subrc
<> 0.
MESSAGE
'Transport creation failed'
TYPE
'E'
.
ENDIF
.
DATA
(lv_trkorr_toc) = ls_request_header-trkorr.
CALL
FUNCTION
'TRINT_APPEND_COMM'
EXPORTING
wi_exclusive =
'X'
wi_sel_e071 =
'X'
wi_sel_e071k =
'X'
wi_trkorr = lv_trkorr_toc
TABLES
wt_e071 = lt_objects
wt_e071k = lt_keys
EXCEPTIONS
e071k_append_error = 1
e071_append_error = 2
trkorr_empty = 3
OTHERS
= 4.
IF
sy-subrc
<> 0.
MESSAGE
'Could not append objects to ToC'
TYPE
'E'
.
ENDIF
.
DATA
lt_messages
TYPE
ctsgerrmsgs.
CALL
FUNCTION
'TRINT_RELEASE_REQUEST'
EXPORTING
iv_trkorr = lv_trkorr_toc
iv_without_locking =
'X'
IMPORTING
et_messages = lt_messages
EXCEPTIONS
cts_initialization_failure = 1
enqueue_failed = 2
no_authorization = 3
invalid_request = 4
request_already_released = 5
repeat_too_early = 6
object_lock_error = 7
object_check_error = 8
docu_missing = 9
db_access_error = 10
action_aborted_by_user = 11
export_failed = 12
execute_objects_check = 13
release_in_bg_mode = 14
release_in_bg_mode_w_objchk = 15
error_in_export_methods = 16
object_lang_error = 17
OTHERS
= 18.
IF
sy-subrc
<> 0.
MESSAGE
'Could not release ToC'
TYPE
'E'
.
cl_demo_output=>display( lt_messages ).
ENDIF
.
DATA
lv_xcontent_k
TYPE
xstring.
DATA
lv_xcontent_r
TYPE
xstring.
DATA
(lv_transdir_k) = |{ p_sapdir }cofiles/K{ lv_trkorr_toc+4 }.{ lv_trkorr_toc(3) }|.
DATA
(lv_transdir_r) = |{ p_sapdir }
data
/R{ lv_trkorr_toc+4 }.{ lv_trkorr_toc(3) }|.
TRY
.
OPEN
DATASET
lv_transdir_k
FOR
INPUT
IN
BINARY
MODE
.
READ
DATASET
lv_transdir_k
INTO
lv_xcontent_k.
CLOSE
DATASET
lv_transdir_k.
OPEN
DATASET
lv_transdir_r
FOR
INPUT
IN
BINARY
MODE
.
READ
DATASET
lv_transdir_r
INTO
lv_xcontent_r.
CLOSE
DATASET
lv_transdir_r.
DATA
(lo_zipper) =
NEW
cl_abap_zip( ).
lo_zipper->add( name = |K{ lv_trkorr_toc+4 }.{ lv_trkorr_toc(3) }|
content = lv_xcontent_k ).
lo_zipper->add( name = |R{ lv_trkorr_toc+4 }.{ lv_trkorr_toc(3) }|
content = lv_xcontent_r ).
DATA
(lv_xzip) = lo_zipper->save( ).
DATA
(lt_data) = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_xzip ).
DATA
(lv_zip_name) =
COND
#(
WHEN
p_ttext
IS
INITIAL
THEN
|{ ls_request-h-as4text }_{ lv_trkorr_toc }|
ELSE
|{ p_ttext }_{ lv_trkorr_toc }| ).
REPLACE
ALL
OCCURRENCES
OF
REGEX
'[^\w]+'
IN lv_zip_name
WITH
'_'
.
cl_gui_frontend_services=>gui_download(
EXPORTING
filename = p_lcldir && lv_zip_name &&
'.zip'
filetype =
'BIN'
CHANGING
data_tab = lt_data ).
CATCH
cx_root
INTO
DATA
(e_text).
MESSAGE
e_text->get_text( )
TYPE
'E'
.
ENDTRY
.
MESSAGE
|{ lv_zip_name }.zip created
and
downloaded to { p_lcldir }|
TYPE
'S'
.