Skip to content

Instantly share code, notes, and snippets.

@kgorin8
Created October 31, 2019 10:05
Show Gist options
  • Save kgorin8/3d34b4df0c17a52b1a657253329a0693 to your computer and use it in GitHub Desktop.
Save kgorin8/3d34b4df0c17a52b1a657253329a0693 to your computer and use it in GitHub Desktop.
*&---------------------------------------------------------------------*
*& Report ZDOWNLOAD_UPLOAD_SETUP
*&---------------------------------------------------------------------*
*& original from https://github.com/Keller-Michael/synchronize-SAP-GUI-favorites/
*&---------------------------------------------------------------------*
REPORT zdownload_upload_setup.
TABLES sscrfields.
DATA gc_version TYPE text30 VALUE '2018.1-01 (19.03.2018)'.
SELECTION-SCREEN: BEGIN OF BLOCK download WITH FRAME TITLE gv_tx000,
BEGIN OF LINE,
COMMENT 1(23) gv_tx001,
POSITION 25.
PARAMETERS: pa_ddir TYPE string.
SELECTION-SCREEN: END OF LINE,
BEGIN OF LINE.
PARAMETERS: pa_noup TYPE abap_bool AS CHECKBOX.
SELECTION-SCREEN: COMMENT 3(76) gv_tx010,
END OF LINE,
END OF BLOCK download.
SELECTION-SCREEN: BEGIN OF BLOCK upload WITH FRAME TITLE gv_tx008,
BEGIN OF LINE,
COMMENT 1(23) gv_tx002,
POSITION 25.
PARAMETERS: pa_udir TYPE string.
SELECTION-SCREEN: END OF LINE,
END OF BLOCK upload.
SELECTION-SCREEN: BEGIN OF BLOCK options WITH FRAME TITLE gv_tx009,
BEGIN OF LINE.
PARAMETERS: pa_msg TYPE abap_bool AS CHECKBOX.
SELECTION-SCREEN: COMMENT 3(76) gv_tx007,
END OF LINE,
END OF BLOCK options.
SELECTION-SCREEN: BEGIN OF BLOCK start_tcode WITH FRAME TITLE gv_tx003,
BEGIN OF LINE,
COMMENT 1(11) gv_tx004,
POSITION 12.
PARAMETERS: pa_tcode TYPE tcode VISIBLE LENGTH 10.
SELECTION-SCREEN: COMMENT 26(10) gv_tx005,
POSITION 36.
PARAMETERS: pa_rep TYPE raldb_repo VISIBLE LENGTH 10.
SELECTION-SCREEN: COMMENT 50(11) gv_tx006,
POSITION 62.
PARAMETERS: pa_var TYPE raldb_vari.
SELECTION-SCREEN: END OF LINE,
END OF BLOCK start_tcode.
SELECTION-SCREEN: FUNCTION KEY 1.
CLASS lcx_error DEFINITION INHERITING FROM cx_static_check.
PUBLIC SECTION.
INTERFACES if_t100_dyn_msg.
ENDCLASS.
CLASS lcl_gui_favorites DEFINITION.
PUBLIC SECTION.
TYPES: BEGIN OF file_content_line,
rtype TYPE reporttype,
parent_id TYPE menu_num_5,
object_id TYPE menu_num_5,
tcode TYPE extdreport,
text TYPE char100sm,
sap_guid TYPE hier_guid,
url TYPE agr_url,
END OF file_content_line.
TYPES: BEGIN OF file_list_line,
file_name TYPE string,
system_id TYPE sysid,
client TYPE mandt,
date TYPE sydatum,
time TYPE syuzeit,
END OF file_list_line.
TYPES: file_list TYPE TABLE OF file_list_line,
file_content TYPE TABLE OF file_content_line.
DATA: download_done TYPE abap_bool READ-ONLY,
upload_done TYPE abap_bool READ-ONLY,
favorites TYPE TABLE OF smen_buffc READ-ONLY,
gui_favorites TYPE TABLE OF favorites READ-ONLY,
links TYPE TABLE OF smen_buffi READ-ONLY.
METHODS constructor
IMPORTING
iv_download_dir TYPE string OPTIONAL
iv_upload_dir TYPE string OPTIONAL
iv_refuse_autoup TYPE abap_bool.
METHODS download_and_upload
RAISING
lcx_error.
PRIVATE SECTION.
DATA: download_dir TYPE string,
upload_dir TYPE string,
refuse_autoup TYPE abap_bool.
METHODS build_file_name_for_download
EXPORTING
ev_file_name TYPE string.
METHODS download_to_directory
RAISING
lcx_error.
METHODS get_file_list_for_upload
EXPORTING
et_file_list TYPE file_list
RAISING
lcx_error.
METHODS upload_from_directory
RAISING
lcx_error.
ENDCLASS.
CLASS lcl_download_and_upload DEFINITION.
PUBLIC SECTION.
METHODS constructor
IMPORTING
iv_download_dir TYPE string
iv_refuse_autoup TYPE abap_bool
iv_upload_dir TYPE string
iv_tcode TYPE tcode OPTIONAL
iv_report TYPE raldb_repo OPTIONAL
iv_variant TYPE raldb_vari OPTIONAL
RAISING
lcx_error.
METHODS send_greeting_to_programmer.
CLASS-METHODS show_information.
METHODS run
RAISING
lcx_error.
METHODS start_report_or_tcode.
PRIVATE SECTION.
DATA: gui_favorites TYPE REF TO lcl_gui_favorites,
download_dir TYPE string,
refuse_autoup TYPE abap_bool,
upload_dir TYPE string,
tcode TYPE tcode,
report TYPE raldb_repo,
variant TYPE raldb_vari.
METHODS check_report_existence
IMPORTING
iv_report TYPE raldb_repo
RETURNING
VALUE(rv_result) TYPE abap_bool.
METHODS check_tcode_existence
IMPORTING
iv_tcode TYPE tcode
RETURNING
VALUE(rv_result) TYPE abap_bool.
METHODS check_variant_existence
IMPORTING
iv_report TYPE raldb_repo
iv_variant TYPE raldb_vari
RETURNING
VALUE(rv_result) TYPE abap_bool.
METHODS get_report_of_transaction
IMPORTING
iv_tcode TYPE tcode
RETURNING
VALUE(rv_report) TYPE raldb_repo.
ENDCLASS.
CLASS lcx_error IMPLEMENTATION.
ENDCLASS.
CLASS lcl_download_and_upload IMPLEMENTATION.
METHOD check_tcode_existence.
DATA lv_tcode TYPE tcode.
SELECT SINGLE tcode
FROM tstc
INTO lv_tcode
WHERE tcode = iv_tcode.
IF sy-subrc = 0.
rv_result = abap_true.
ENDIF.
ENDMETHOD.
METHOD check_report_existence.
DATA lv_report TYPE progname.
" must be active and executable
SELECT SINGLE progname
FROM reposrc
INTO lv_report
WHERE progname = iv_report
AND r3state = 'A'
AND subc = '1'.
IF sy-subrc = 0.
rv_result = abap_true.
ENDIF.
ENDMETHOD.
METHOD check_variant_existence.
DATA lv_rc TYPE sysubrc.
CALL FUNCTION 'RS_VARIANT_EXISTS'
EXPORTING
report = iv_report
variant = iv_variant
IMPORTING
r_c = lv_rc
EXCEPTIONS
not_authorized = 1
no_report = 2
report_not_existent = 3
report_not_supplied = 4
OTHERS = 5.
IF sy-subrc = 0 AND lv_rc = 0.
rv_result = abap_true.
ENDIF.
ENDMETHOD.
METHOD constructor.
DATA lv_result TYPE abap_bool.
IF iv_tcode IS NOT INITIAL.
lv_result = me->check_tcode_existence( EXPORTING iv_tcode = iv_tcode ).
IF lv_result = abap_true.
tcode = iv_tcode.
report = me->get_report_of_transaction( EXPORTING iv_tcode = iv_tcode ).
ELSE.
RAISE EXCEPTION TYPE lcx_error MESSAGE e499(sy) WITH 'Transaction does not exist.'.
ENDIF.
ELSEIF iv_report IS NOT INITIAL.
lv_result = me->check_report_existence( EXPORTING iv_report = iv_report ).
IF lv_result = abap_true.
report = iv_report.
ELSE.
RAISE EXCEPTION TYPE lcx_error MESSAGE e499(sy) WITH 'Report does not exist.'.
ENDIF.
ENDIF.
IF iv_variant IS NOT INITIAL.
lv_result = me->check_variant_existence( EXPORTING iv_report = report iv_variant = iv_variant ).
IF lv_result = abap_true.
variant = iv_variant.
ELSE.
RAISE EXCEPTION TYPE lcx_error MESSAGE e499(sy) WITH 'Variant does not exist.'.
ENDIF.
ENDIF.
IF iv_download_dir IS NOT INITIAL.
CALL METHOD cl_gui_frontend_services=>directory_exist
EXPORTING
directory = iv_download_dir
RECEIVING
result = lv_result
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
wrong_parameter = 3
not_supported_by_gui = 4
OTHERS = 5.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE lcx_error MESSAGE e499(sy) WITH 'Error checking download directory.'.
ELSE.
IF lv_result = abap_true.
download_dir = iv_download_dir.
ELSE.
RAISE EXCEPTION TYPE lcx_error MESSAGE e499(sy) WITH 'Download directory does not exists.'.
ENDIF.
ENDIF.
ENDIF.
IF iv_upload_dir IS NOT INITIAL.
CALL METHOD cl_gui_frontend_services=>directory_exist
EXPORTING
directory = iv_upload_dir
RECEIVING
result = lv_result
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
wrong_parameter = 3
not_supported_by_gui = 4
OTHERS = 5.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE lcx_error MESSAGE e499(sy) WITH 'Error checking upload directory.'.
ELSE.
IF lv_result = abap_true.
upload_dir = iv_upload_dir.
ELSE.
RAISE EXCEPTION TYPE lcx_error MESSAGE e499(sy) WITH 'Upload directory does not exists.'.
ENDIF.
ENDIF.
ENDIF.
refuse_autoup = iv_refuse_autoup.
CREATE OBJECT gui_favorites
EXPORTING
iv_download_dir = download_dir
iv_refuse_autoup = refuse_autoup
iv_upload_dir = upload_dir.
" !!! raising in constructor
IF gui_favorites IS NOT BOUND.
RETURN.
ENDIF.
ENDMETHOD.
METHOD get_report_of_transaction.
DATA lv_report TYPE progname.
SELECT SINGLE pgmna
FROM tstc
INTO lv_report
WHERE tcode = iv_tcode.
IF sy-subrc <> 0.
RETURN.
ENDIF.
SELECT SINGLE progname
FROM reposrc
INTO lv_report
WHERE progname = lv_report
AND r3state = 'A'
AND subc = '1'.
IF sy-subrc = 0.
rv_report = lv_report.
ENDIF.
ENDMETHOD.
METHOD run.
gui_favorites->download_and_upload( ).
IF gui_favorites->download_done = abap_true AND gui_favorites->upload_done = abap_true.
MESSAGE 'SAP GUI favorites downloaded and uploaded.' TYPE 'S'.
ELSEIF gui_favorites->download_done = abap_true AND gui_favorites->upload_done = abap_false.
MESSAGE 'SAP GUI favorites downloaded.' TYPE 'S'.
ELSEIF gui_favorites->download_done = abap_false AND gui_favorites->upload_done = abap_true.
MESSAGE 'SAP GUI favorites uploaded.' TYPE 'S'.
ENDIF.
" Perhaps you want to download and upload your SE80 favorites? Or other important data?
" Add your source code here ...
ENDMETHOD.
METHOD show_information.
DATA lv_version TYPE text80.
CONCATENATE 'Version' gc_version INTO lv_version SEPARATED BY space.
CALL FUNCTION 'POPUP_TO_INFORM'
EXPORTING
titel = 'Version information'
txt1 = 'Download and upload your SAP GUI favorites'
txt2 = lv_version
txt3 = 'written by Michael Keller'
txt4 = 'use it, improve it, share it ...'.
ENDMETHOD.
METHOD start_report_or_tcode.
IF report IS NOT INITIAL AND variant IS NOT INITIAL.
SUBMIT (report) USING SELECTION-SET variant.
ELSEIF report IS NOT INITIAL AND variant IS INITIAL.
SUBMIT (report).
ELSEIF tcode IS NOT INITIAL.
CALL TRANSACTION tcode.
ENDIF.
ENDMETHOD.
METHOD send_greeting_to_programmer.
" obviously a hidden message ... and a good chance to say hello and thank you for studying
" this source code. Please improve it and share it with SAP community. Kind regards
ENDMETHOD.
ENDCLASS.
CLASS lcl_gui_favorites IMPLEMENTATION.
METHOD build_file_name_for_download.
DATA lv_file_name TYPE string.
CONCATENATE download_dir '\'
sy-datum+0(4) '-'
sy-datum+4(2) '-'
sy-datum+6(2) '_'
sy-uzeit+0(2) '-'
sy-uzeit+2(2) '-'
sy-uzeit+4(2) '_'
sy-sysid '_'
sy-mandt INTO lv_file_name.
IF refuse_autoup = abap_true.
" NOAUTOUP is our sign to deny automatic upload
CONCATENATE lv_file_name '_NOAUTOUP_gui_favorites.txt' INTO lv_file_name.
ELSE.
CONCATENATE lv_file_name '_gui_favorites.txt' INTO lv_file_name.
ENDIF.
ev_file_name = lv_file_name.
ENDMETHOD.
METHOD constructor.
download_dir = iv_download_dir.
upload_dir = iv_upload_dir.
refuse_autoup = iv_refuse_autoup.
CALL FUNCTION 'NAVIGATION_LOAD_FAVORITES'
EXPORTING
user_name = sy-uname
TABLES
favorites_tab = favorites
favorites_for_gui = gui_favorites
links_list = links.
ENDMETHOD.
METHOD download_and_upload.
IF download_dir IS NOT INITIAL.
me->download_to_directory( ).
ENDIF.
IF upload_dir IS NOT INITIAL.
me->upload_from_directory( ).
ENDIF.
ENDMETHOD.
METHOD download_to_directory.
DATA: ls_links TYPE smen_buffi,
ls_favorites TYPE smen_buffc,
lt_file_content TYPE file_content,
ls_file_content TYPE file_content_line,
lv_file_name TYPE string.
" prepare SAP GUI favorites for download
LOOP AT favorites INTO ls_favorites.
CLEAR: ls_file_content,
ls_links.
ls_file_content-rtype = ls_favorites-reporttype.
ls_file_content-parent_id = ls_favorites-parent_id.
ls_file_content-object_id = ls_favorites-object_id.
ls_file_content-tcode = ls_favorites-report.
ls_file_content-sap_guid = ls_favorites-sap_guid.
ls_file_content-text = ls_favorites-text.
IF ls_favorites-reporttype EQ 'OT'.
READ TABLE links WITH KEY object_id = ls_favorites-object_id INTO ls_links.
IF sy-subrc = 0.
ls_file_content-url = ls_links-url.
ENDIF.
ENDIF.
APPEND ls_file_content TO lt_file_content.
ENDLOOP.
IF lt_file_content IS INITIAL.
RETURN.
ENDIF.
me->build_file_name_for_download( IMPORTING ev_file_name = lv_file_name ).
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
* bin_filesize =
filename = lv_file_name
* filetype = 'ASC'
* append = SPACE
* write_field_separator = SPACE
* header = '00'
* trunc_trailing_blanks = SPACE
* write_lf = 'X'
* col_select = SPACE
* col_select_mask = SPACE
* dat_mode = SPACE
* confirm_overwrite = SPACE
* no_auth_check = SPACE
* codepage = SPACE
* ignore_cerr = ABAP_TRUE
* replacement = '#'
* write_bom = SPACE
* trunc_trailing_blanks_eol = 'X'
* wk1_n_format = SPACE
* wk1_n_size = SPACE
* wk1_t_format = SPACE
* wk1_t_size = SPACE
show_transfer_status = space
* fieldnames =
* write_lf_after_last_line = 'X'
* virus_scan_profile = '/SCET/GUI_DOWNLOAD'
* IMPORTING
* filelength =
CHANGING
data_tab = lt_file_content
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
not_supported_by_gui = 22
error_no_gui = 23
OTHERS = 24.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE lcx_error MESSAGE e499(sy) WITH 'Error download to frontend.'.
ENDIF.
download_done = abap_true.
ENDMETHOD.
METHOD get_file_list_for_upload.
DATA: lt_file_info TYPE TABLE OF file_info,
ls_file_info TYPE file_info,
lt_file_list TYPE file_list,
ls_file_list TYPE file_list_line,
lv_count TYPE i,
lt_parts TYPE TABLE OF string,
ls_parts TYPE string.
CALL METHOD cl_gui_frontend_services=>directory_list_files
EXPORTING
directory = upload_dir
filter = '*.txt'
files_only = abap_true
* directories_only =
CHANGING
file_table = lt_file_info
count = lv_count
EXCEPTIONS
cntl_error = 1
directory_list_files_failed = 2
wrong_parameter = 3
error_no_gui = 4
not_supported_by_gui = 5
OTHERS = 6.
IF sy-subrc <> 0.
RETURN.
ENDIF.
LOOP AT lt_file_info INTO ls_file_info.
CLEAR ls_file_list.
SPLIT ls_file_info-filename AT '_' INTO TABLE lt_parts.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
READ TABLE lt_parts TRANSPORTING NO FIELDS WITH KEY table_line = 'NOAUTOUP'.
IF sy-subrc = 0.
CONTINUE. " no automatic upload allowed
ENDIF.
CONCATENATE upload_dir '\' ls_file_info-filename INTO ls_file_list-file_name.
LOOP AT lt_parts INTO ls_parts.
CASE sy-tabix.
WHEN '1'. " date
REPLACE ALL OCCURRENCES OF '-' IN ls_parts WITH space.
CONDENSE ls_parts NO-GAPS.
WRITE ls_parts TO ls_file_list-date.
WHEN '2'. " time
REPLACE ALL OCCURRENCES OF '-' IN ls_parts WITH space.
CONDENSE ls_parts NO-GAPS.
WRITE ls_parts TO ls_file_list-time.
WHEN '3'. " system id
ls_file_list-system_id = ls_parts.
WHEN '4'. " client
ls_file_list-client = ls_parts.
ENDCASE.
ENDLOOP.
APPEND ls_file_list TO lt_file_list.
ENDLOOP.
" only latest files
SORT lt_file_list BY system_id client date DESCENDING time DESCENDING.
DELETE ADJACENT DUPLICATES FROM lt_file_list COMPARING system_id client.
" not for this system id and client
DELETE lt_file_list WHERE system_id = sy-sysid AND client = sy-mandt.
SORT lt_file_list BY system_id client date.
et_file_list = lt_file_list.
ENDMETHOD.
METHOD upload_from_directory.
TYPES: BEGIN OF replaced_object_id_entry,
old_object_id TYPE menu_num_5,
new_object_id TYPE menu_num_5,
END OF replaced_object_id_entry.
DATA: lt_file_list TYPE file_list,
ls_file_list TYPE file_list_line,
lt_file_content TYPE file_content,
ls_file_content TYPE file_content_line,
ls_favorites TYPE smen_buffc,
lv_folder_name TYPE ssm_title,
lv_new_root TYPE menu_num_5,
lv_old_parent_id TYPE menu_num_5,
lt_replaced_id TYPE TABLE OF replaced_object_id_entry,
ls_replaced_id TYPE replaced_object_id_entry,
lv_first_node TYPE menu_flag,
lv_object_id TYPE menu_num_5,
lv_target_id TYPE menu_num_5,
lv_new_id TYPE menu_num_5,
lv_text TYPE ssm_title,
lv_tcode TYPE tcode.
me->get_file_list_for_upload( IMPORTING et_file_list = lt_file_list ).
IF lt_file_list IS INITIAL.
RETURN.
ENDIF.
LOOP AT lt_file_list INTO ls_file_list.
CLEAR: lt_file_content,
lt_replaced_id,
ls_favorites.
CALL METHOD cl_gui_frontend_services=>gui_upload
EXPORTING
filename = ls_file_list-file_name
* filetype = 'ASC'
* has_field_separator = SPACE
* header_length = 0
* read_by_line = 'X'
* dat_mode = SPACE
* codepage = SPACE
* ignore_cerr = ABAP_TRUE
* replacement = '#'
* virus_scan_profile =
* IMPORTING
* filelength =
* header =
CHANGING
data_tab = lt_file_content
* isscanperformed = SPACE
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
not_supported_by_gui = 17
error_no_gui = 18
OTHERS = 19.
IF sy-subrc <> 0 OR lt_file_content IS INITIAL.
RAISE EXCEPTION TYPE lcx_error MESSAGE e499(sy) WITH 'Error upload from frontend.'.
ENDIF.
CONCATENATE ls_file_list-system_id '-' ls_file_list-client INTO lv_folder_name.
" Check if folder for system id and client is already there, then delete it.
" Should be more easy than comparing entries.
READ TABLE favorites INTO ls_favorites WITH KEY text = lv_folder_name.
IF sy-subrc = 0.
CALL FUNCTION 'FAVOS_EVENT_DELETE_FROM_SHELF'
EXPORTING
user_name = sy-uname
object_id = ls_favorites-object_id
TABLES
user_shelf = favorites
user_links = links.
ENDIF.
" add folder for system id and client, that's our new root
CALL FUNCTION 'FAVOS_EVENT_ADD_TO_USER_SHELF'
EXPORTING
user_name = sy-uname
target_id = '0001'
reporttype = space
* REPORT_NAME =
* SAP_GUID =
text = lv_folder_name
first_node = 'X'
* URL = ' '
* BOOK_INFO = ' '
* X_POS = ' '
* Y_POS = ' '
* TARGET_SYST = ' '
* PERS_MINI =
* PERS_WIN =
IMPORTING
new_id = lv_new_root
TABLES
user_shelf = favorites
user_links = links.
" add SAP GUI favorites from the file under new root
LOOP AT lt_file_content INTO ls_file_content.
CLEAR: lv_first_node,
lv_target_id,
lv_new_id,
ls_replaced_id,
lv_text.
" check if transaction code really exists in this system
IF ls_file_content-rtype = 'TR'.
SELECT SINGLE tcode
FROM tstc
INTO lv_tcode
WHERE tcode = ls_file_content-tcode.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
ENDIF.
IF ls_file_content-parent_id > lv_new_root AND ls_file_content-parent_id <> lv_old_parent_id.
lv_first_node = 'X'.
ENDIF.
lv_old_parent_id = ls_file_content-parent_id.
" get parent id
READ TABLE lt_replaced_id INTO ls_replaced_id WITH KEY old_object_id = ls_file_content-parent_id.
IF sy-subrc = 0.
lv_target_id = ls_replaced_id-new_object_id.
ELSE.
lv_target_id = lv_new_root.
ENDIF.
lv_text = ls_file_content-text.
CALL FUNCTION 'FAVOS_EVENT_ADD_TO_USER_SHELF'
EXPORTING
user_name = sy-uname
target_id = lv_target_id
reporttype = ls_file_content-rtype
report_name = ls_file_content-tcode
sap_guid = ls_file_content-sap_guid
text = lv_text
first_node = lv_first_node
url = ls_file_content-url
* BOOK_INFO = ' '
* X_POS = ' '
* Y_POS = ' '
* TARGET_SYST = ' '
* PERS_MINI =
* PERS_WIN =
IMPORTING
NEW_ID = lv_new_id
TABLES
user_shelf = favorites
user_links = links.
" remember what we switched
ls_replaced_id-old_object_id = ls_file_content-object_id.
ls_replaced_id-new_object_id = lv_new_id.
APPEND ls_replaced_id TO lt_replaced_id.
ENDLOOP. " file content
ENDLOOP. " file list
upload_done = abap_true.
ENDMETHOD.
ENDCLASS.
INITIALIZATION.
PERFORM initialize.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_ddir.
PERFORM choose_directory USING 'DOWNLOAD'.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_udir.
PERFORM choose_directory USING 'UPLOAD'.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_tcode.
PERFORM choose_tcode_or_report USING 'TCODE'.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_rep.
PERFORM choose_tcode_or_report USING 'REPORT'.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_var.
PERFORM choose_variant.
AT SELECTION-SCREEN.
PERFORM user_command.
START-OF-SELECTION.
PERFORM run.
FORM run.
DATA: lr_download_and_upload TYPE REF TO lcl_download_and_upload,
lr_error TYPE REF TO lcx_error,
lv_message TYPE string.
TRY.
CREATE OBJECT lr_download_and_upload
EXPORTING
iv_download_dir = pa_ddir
iv_refuse_autoup = pa_noup
iv_upload_dir = pa_udir
iv_tcode = pa_tcode
iv_report = pa_rep
iv_variant = pa_var.
lr_download_and_upload->run( ).
CATCH lcx_error INTO lr_error.
IF pa_msg = abap_true.
lv_message = lr_error->get_text( ).
MESSAGE lv_message TYPE 'I'.
ENDIF.
RETURN.
ENDTRY.
IF pa_tcode IS NOT INITIAL OR pa_rep IS NOT INITIAL.
lr_download_and_upload->start_report_or_tcode( ).
ENDIF.
ENDFORM.
FORM initialize.
DATA: lv_variant TYPE raldb_vari,
ls_dyntxt TYPE smp_dyntxt.
sy-title = 'Download and upload your SAP GUI favorites'.
gv_tx000 = 'Settings to download your SAP GUI favorites'.
gv_tx001 = 'Download to directory'.
gv_tx002 = 'Upload from directory'.
gv_tx003 = 'Set transaction/report to start afterwards'.
gv_tx004 = 'transaction'.
gv_tx005 = 'or report'.
gv_tx006 = 'and variant'.
gv_tx007 = 'show message in case of error'.
gv_tx008 = 'Settings to upload your SAP GUI favorites'.
gv_tx009 = 'General settings'.
gv_tx010 = 'refuse to upload the created file automatically in another system/client'.
lv_variant = sy-uname.
CALL FUNCTION 'RS_SUPPORT_SELECTIONS'
EXPORTING
report = sy-repid
variant = lv_variant
EXCEPTIONS
variant_not_existent = 1
variant_obsolete = 2
OTHERS = 3.
IF sy-subrc <> 0. " no error handling due to point in time
ENDIF.
CLEAR ls_dyntxt.
ls_dyntxt-icon_id = icon_information.
ls_dyntxt-quickinfo = 'Show documentation'.
ls_dyntxt-path = 'T'.
sscrfields-functxt_01 = ls_dyntxt.
ENDFORM.
FORM choose_directory USING uv_kind TYPE char8.
DATA: lv_title TYPE string,
lv_folder TYPE string.
CALL METHOD cl_gui_frontend_services=>get_desktop_directory
CHANGING
desktop_directory = lv_folder
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE 'Desktop directory could not be determined.' TYPE 'I'.
RETURN.
ENDIF.
CALL METHOD cl_gui_cfw=>flush
EXCEPTIONS
cntl_system_error = 1
cntl_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE 'Desktop directory could not be determined.' TYPE 'I'.
RETURN.
ENDIF.
IF uv_kind = 'DOWNLOAD'.
lv_title = 'Download to directory'.
ELSEIF uv_kind = 'UPLOAD'.
lv_title = 'Upload from directory'.
ENDIF.
CALL METHOD cl_gui_frontend_services=>directory_browse
EXPORTING
window_title = lv_title
initial_folder = lv_folder
CHANGING
selected_folder = lv_folder
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE 'Error browsing directories.' TYPE 'I'.
RETURN.
ENDIF.
IF lv_folder IS INITIAL.
RETURN.
ENDIF.
IF uv_kind = 'DOWNLOAD'.
pa_ddir = lv_folder.
ELSEIF uv_kind = 'UPLOAD'.
pa_udir = lv_folder.
ENDIF.
ENDFORM.
FORM choose_tcode_or_report USING uv_kind TYPE char6.
DATA: lv_dynpro_field TYPE dynfnam,
lv_object TYPE char4,
lv_progname TYPE progname.
IF uv_kind = 'TCODE'.
lv_dynpro_field = 'PA_TCODE'.
lv_object = 'T'.
ELSEIF uv_kind = 'REPORT'.
lv_dynpro_field = 'PA_REP'.
lv_object = 'PR'.
ENDIF.
lv_progname = sy-repid.
CALL FUNCTION 'RS_HELP_HANDLING'
EXPORTING
dynpfield = lv_dynpro_field
dynpname = '1000'
object = lv_object
progname = lv_progname.
ENDFORM.
FORM choose_variant.
DATA: lt_fields TYPE TABLE OF dynpread,
ls_fields TYPE dynpread,
lv_input TYPE i,
lv_report TYPE raldb_repo,
lv_message TYPE itex132,
lv_variant TYPE raldb_vari.
ls_fields-fieldname = 'PA_TCODE'.
APPEND ls_fields TO lt_fields.
ls_fields-fieldname = 'PA_REP'.
APPEND ls_fields TO lt_fields.
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
dyname = sy-repid
dynumb = sy-dynnr
* TRANSLATE_TO_UPPER = ' '
* REQUEST = ' '
* PERFORM_CONVERSION_EXITS = ' '
* PERFORM_INPUT_CONVERSION = ' '
* DETERMINE_LOOP_INDEX = ' '
* START_SEARCH_IN_CURRENT_SCREEN = ' '
* START_SEARCH_IN_MAIN_SCREEN = ' '
* START_SEARCH_IN_STACKED_SCREEN = ' '
* START_SEARCH_ON_SCR_STACKPOS = ' '
* SEARCH_OWN_SUBSCREENS_FIRST = ' '
* SEARCHPATH_OF_SUBSCREEN_AREAS = ' '
TABLES
dynpfields = lt_fields
EXCEPTIONS
invalid_abapworkarea = 1
invalid_dynprofield = 2
invalid_dynproname = 3
invalid_dynpronummer = 4
invalid_request = 5
no_fielddescription = 6
invalid_parameter = 7
undefind_error = 8
double_conversion = 9
stepl_not_found = 10
OTHERS = 11.
IF sy-subrc <> 0.
RETURN.
ENDIF.
LOOP AT lt_fields INTO ls_fields WHERE fieldvalue IS NOT INITIAL.
lv_input = lv_input + 1.
ENDLOOP.
IF lv_input = 0 OR lv_input = 2.
MESSAGE 'Please choose between transaction or report.' TYPE 'I'.
RETURN.
ENDIF.
READ TABLE lt_fields INTO ls_fields WITH KEY fieldname = 'PA_TCODE'.
IF sy-subrc = 0 AND ls_fields-fieldvalue IS NOT INITIAL.
SELECT SINGLE pgmna
FROM tstc
INTO lv_report
WHERE tcode = ls_fields-fieldvalue.
IF sy-subrc <> 0.
lv_message = 'No report for transaction &1 found.'.
REPLACE '&1' IN lv_message WITH ls_fields-fieldvalue.
MESSAGE lv_message TYPE 'I'.
RETURN.
ENDIF.
ENDIF.
IF lv_report IS INITIAL.
READ TABLE lt_fields INTO ls_fields WITH KEY fieldname = 'PA_REP'.
IF sy-subrc = 0 AND ls_fields-fieldvalue IS NOT INITIAL.
lv_report = ls_fields-fieldvalue.
ENDIF.
ENDIF.
IF lv_report IS INITIAL.
MESSAGE 'No combination to get variant catalog.' TYPE 'I'.
RETURN.
ENDIF.
CALL FUNCTION 'RS_VARIANT_CATALOG'
EXPORTING
report = lv_report
* NEW_TITLE = ' '
* DYNNR =
* INTERNAL_CALL = ' '
* MASKED = 'X'
* VARIANT = ' '
* POP_UP = ' '
IMPORTING
sel_variant = lv_variant
* SEL_VARIANT_TEXT =
* TABLES
* BELONGING_DYNNR =
EXCEPTIONS
no_report = 1
report_not_existent = 2
report_not_supplied = 3
no_variants = 4
no_variant_selected = 5
variant_not_existent = 6
OTHERS = 7.
CASE sy-subrc.
WHEN 0.
WHEN 2.
lv_message = 'Report &1 not exists.'.
WHEN 3.
lv_message = 'Report &1 cannot be startet with a variant.'.
WHEN 4.
lv_message = 'There are no variants for report &1.'.
WHEN 5.
RETURN.
WHEN OTHERS.
lv_message = 'An unknown error occured.'.
ENDCASE.
IF lv_message IS NOT INITIAL.
REPLACE '&1' IN lv_message WITH lv_report.
MESSAGE lv_message TYPE 'I'.
RETURN.
ENDIF.
CLEAR lt_fields.
ls_fields-fieldname = 'PA_VAR'.
ls_fields-fieldvalue = lv_variant.
APPEND ls_fields TO lt_fields.
CALL FUNCTION 'DYNP_VALUES_UPDATE'
EXPORTING
dyname = sy-repid
dynumb = sy-dynnr
TABLES
dynpfields = lt_fields
EXCEPTIONS
invalid_abapworkarea = 1
invalid_dynprofield = 2
invalid_dynproname = 3
invalid_dynpronummer = 4
invalid_request = 5
no_fielddescription = 6
undefind_error = 7
OTHERS = 8.
IF sy-subrc <> 0.
MESSAGE 'An unknown error occured.' TYPE 'I'.
RETURN.
ENDIF.
ENDFORM.
FORM user_command.
IF sy-dynnr <> '1000'.
RETURN.
ENDIF.
IF sy-ucomm = 'FC01'.
lcl_download_and_upload=>show_information( ).
ENDIF.
ENDFORM.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment