MACRO_UDF_DOWNLOAD
Sometimes we need to download our internal table to local computer.
I got this code from old code by Fredy Santoso. All credits to him.
All we need to call this macro is 1 line like this
macro_udf_download filename 'ASC' itab.
Declaration variables:
DATA: d_udf_totalrecords TYPE i,
d_udf_tab TYPE x VALUE '09',
d_udf_subrc LIKE sy-subrc,
d_udf_fsize TYPE i,
d_udf_memid LIKE sy-cprog,
d_udf_chkfl VALUE 'X', " Need to check file ?
d_udf_fname LIKE rlgrap-filename,
d_udf_drcty LIKE pcfile-path,
d_udf_drive LIKE pcfile-drive,
d_udf_filnm LIKE rlgrap-filename,
d_udf_extns(8),
d_udf_dspms VALUE 'X', "Flags to display error message
d_udf_dsn_msg(50).
DATA: d_udf_lngth TYPE i,
d_udf_count TYPE i,
d_udf_start TYPE i,
d_udf_nchar,
d_udf_xchar TYPE x.
*-----------------------------------------------------------------------
* @form MACRO_UDF_DOWNLOAD
* @description download data from SAP
* @param &1
* @par-desc filename used, if no file given then call save as file
* dialog selected
* @param &2
* @par-desc download data type
* @par-val 'ASC' for ascii file
* 'DAT' for dat file
* see WS_DOWNLOAD documentation for filetype
* @param &3
* @par-desc itab to download
*-----------------------------------------------------------------------
DEFINE macro_udf_download.
IF &1 EQ space.
PERFORM f_udf_get_filename USING 'S' &1.
ENDIF.
IF &1 NE space.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
* bin_filesize = d_udf_fsize
filename = &1
filetype = &2
write_field_separator = 'X'
dat_mode = 'X'
TABLES
data_tab = &3
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
OTHERS = 22.
d_udf_subrc = sy-subrc.
IF d_udf_subrc NE 0 AND d_udf_dspms NE space.
CASE sy-subrc.
WHEN 1. MESSAGE i000(zamd) WITH 'File write error !'.
WHEN 2. MESSAGE i000(zamd) WITH 'No Batch !'.
WHEN 3. MESSAGE i000(zamd) WITH 'GUI refuse file transfer !'.
WHEN 4. MESSAGE i000(zamd) WITH 'Invalid type !'.
WHEN 5. MESSAGE i000(zamd) WITH 'No authority !'.
WHEN 6. MESSAGE i000(zamd) WITH 'Unknown error !'.
WHEN 7. MESSAGE i000(zamd) WITH 'Header not allowed !'.
WHEN 8. MESSAGE i000(zamd) WITH 'Separator not allowed !'.
WHEN 9. MESSAGE i000(zamd) WITH 'File size not allowed !'.
WHEN 10. MESSAGE i000(zamd) WITH 'Header too long !'.
WHEN 11. MESSAGE i000(zamd) WITH 'DP error created !'.
WHEN 12. MESSAGE i000(zamd) WITH 'DP error send !'.
WHEN 13. MESSAGE i000(zamd) WITH 'DP error write !'.
WHEN 14. MESSAGE i000(zamd) WITH 'Unknown DP error !'.
WHEN 15. MESSAGE i000(zamd) WITH 'Access denied !'.
WHEN 16. MESSAGE i000(zamd) WITH 'DP out of memory !'.
WHEN 17. MESSAGE i000(zamd) WITH 'Disk full !'.
WHEN 18. MESSAGE i000(zamd) WITH 'DP time out !'.
WHEN 19. MESSAGE i000(zamd) WITH 'File not found !'.
WHEN 20. MESSAGE i000(zamd) WITH 'Data provider exception !'.
WHEN 21. MESSAGE i000(zamd) WITH 'Control flush error !'.
WHEN 22. MESSAGE i000(zamd) WITH 'Other unknown error !'.
ENDCASE.
ENDIF.
ENDIF.
END-OF-DEFINITION.
*-----------------------------------------------------------------------
* @form F_UDF_GET_FILENAME
* @description query to window system and show file dialog to choose
* a file
* @param FU_TYPE
* @par-desc type for dialog file
* @par-val 'O' for 'open' file dialog
* 'S' for 'save as' file dialog
* @param FC_FNAME
* @par-desc filename selected
*-----------------------------------------------------------------------
FORM f_udf_get_filename USING fu_type
CHANGING fc_fname.
DATA: ld_filename LIKE rlgrap-filename,
ld_title(20),
ld_length TYPE i,
ld_path(80).
FIELD-SYMBOLS: <lf_symbol>.
ld_path = fc_fname.
IF ld_path NE space. "I-BAK010299
ld_length = strlen( ld_path ) - 1.
ASSIGN ld_path+ld_length(1) TO <lf_symbol>.
IF <lf_symbol> EQ '/' OR <lf_symbol> EQ '\'.
ld_path = ld_path(ld_length).
ENDIF.
ENDIF.
IF fu_type EQ 'O'.
ld_title = 'Open file'.
ELSEIF fu_type EQ 'F'.
ld_title = 'Select file'.
ELSE.
ld_title = 'Save as'.
ENDIF.
DATA: directory TYPE string,
filetable TYPE filetable,
line TYPE LINE OF filetable,
rc TYPE i,
ld_window TYPE string.
CALL METHOD cl_gui_frontend_services=>get_temp_directory
CHANGING
temp_dir = directory.
* Build Filter for Fileselektor]
ld_window = ld_title.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = ld_window
initial_directory = directory
* file_filter = '*.xml'
multiselection = ' '
CHANGING
file_table = filetable
rc = rc.
IF rc = 1.
READ TABLE filetable INDEX 1 INTO line.
ld_filename = line-filename.
ENDIF.
d_udf_subrc = sy-subrc.
CHECK d_udf_subrc = 0.
fc_fname = ld_filename.
CHECK d_udf_chkfl IS INITIAL.
PERFORM f_udf_get_path_name USING fc_fname.
CONCATENATE d_udf_drive ':' d_udf_drcty INTO fc_fname.
ENDFORM. "f_udf_get_filename
*$*$--------------------------------------------------------------------
*$*$ Lib internal use Subroutines
*$*$--------------------------------------------------------------------
*&---------------------------------------------------------------------*
*& Form F_UDF_GET_PATH_NAME
*&---------------------------------------------------------------------*
FORM f_udf_get_path_name USING fu_fname.
DATA: ld_char,
ld_length TYPE i,
ld_position TYPE i,
ld_count TYPE i,
ld_directory LIKE pcfile-path.
ld_directory = fu_fname.
CALL FUNCTION 'PC_SPLIT_COMPLETE_FILENAME'
EXPORTING
complete_filename = ld_directory
* CHECK_DOS_FORMAT =
IMPORTING
drive = d_udf_drive
extension = d_udf_extns
name = d_udf_filnm
name_with_ext = d_udf_fname
path = d_udf_drcty
EXCEPTIONS
invalid_drive = 1
invalid_extension = 2
invalid_name = 3
invalid_path = 4
OTHERS = 5.
d_udf_subrc = sy-subrc.
ENDFORM. " F_UDF_GET_PATH_NAME
Thank you. I hope this post give us more inspiration and not only copy paste. Regards. 🙂