report znadar_file_subr.
selection-screen begin of block b01 with frame.
parameter: filez type string LOWER CASE,
f_pc radiobutton group bol,
f_ho radiobutton group bol.
selection-screen end of block b01.
data: itab(12) occurs 0 with header line.
CLASS z_cl_filez DEFINITION.
PUBLIC SECTION.
DATA: to_from_pc TYPE xfeld,
to_from_host TYPE xfeld,
my_tab TYPE STANDARD TABLE OF string,
filename TYPE string,
filesize TYPE i,
filetype TYPE char10.
METHODS: load CHANGING p_table TYPE table,
save CHANGING p_table TYPE table,
constructor IMPORTING i_filez TYPE string.
PRIVATE SECTION.
METHODS: load_from_pc CHANGING p_table TYPE table,
load_from_host CHANGING p_table TYPE table,
save_to_pc CHANGING p_table TYPE table,
save_to_host CHANGING p_table TYPE table,
open_dialog.
ENDCLASS.
CLASS z_cl_filez IMPLEMENTATION.
METHOD constructor.
IF NOT i_filez IS INITIAL.
me->filename = i_filez.
ENDIF.
me->filetype = 'ASC'. "<- Por defecto siempre en ASCII
me->to_from_pc = 'X'. "<- Por Defecto en local
ENDMETHOD.
METHOD load.
CASE 'X'.
WHEN me->to_from_pc. me->load_from_pc( CHANGING p_table = p_table ).
WHEN me->to_from_host. me->load_from_host( CHANGING p_table = p_table ).
ENDCASE.
ENDMETHOD.
METHOD save.
CASE 'X'.
WHEN me->to_from_pc. me->save_to_pc( CHANGING p_table = p_table ).
WHEN me->to_from_host. me->save_to_host( CHANGING p_table = p_table ).
ENDCASE.
ENDMETHOD.
METHOD open_dialog.
DATA: lv_file_table TYPE filetable,
lv_rc TYPE i.
IF me->filename IS INITIAL.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
* EXPORTING
* WINDOW_TITLE =
* DEFAULT_EXTENSION =
* DEFAULT_FILENAME =
* FILE_FILTER =
* WITH_ENCODING =
* INITIAL_DIRECTORY =
* MULTISELECTION =
CHANGING
file_table = lv_file_table
rc = lv_rc
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5.
READ TABLE lv_file_table INTO me->filename INDEX 1.
ENDIF.
ENDMETHOD.
METHOD: load_from_pc.
me->open_dialog( ).
CHECK sy-subrc EQ 0.
CALL METHOD cl_gui_frontend_services=>gui_upload
EXPORTING
filename = me->filename
filetype = me->filetype
IMPORTING
filelength = me->filesize
* HEADER =
CHANGING
data_tab = p_table
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.
ENDMETHOD.
METHOD: save_to_pc.
me->open_dialog( ).
CHECK sy-subrc EQ 0.
IF me->filetype NE 'BIN'.
CLEAR me->filesize.
ENDIF.
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
bin_filesize = me->filesize
filename = me->filename
filetype = me->filetype
IMPORTING
filelength = me->filesize
CHANGING
data_tab = p_table
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.
ENDMETHOD.
METHOD load_from_host.
DATA: lv_s TYPE REF TO data.
FIELD-SYMBOLS: <lv_s> TYPE any.
CREATE DATA lv_s LIKE LINE OF p_table.
ASSIGN lv_s->* TO <lv_s>.
CHECK NOT me->filename IS INITIAL.
IF me->filetype = 'BIN'.
OPEN DATASET me->filename FOR INPUT IN BINARY MODE.
ELSE.
OPEN DATASET me->filename FOR INPUT IN TEXT MODE ENCODING DEFAULT.
ENDIF.
CHECK sy-subrc EQ 0.
DO.
READ DATASET me->filename INTO <lv_s>.
IF sy-subrc NE 0. EXIT. ENDIF.
APPEND <lv_s> TO p_table.
ENDDO.
CLOSE DATASET me->filename.
ENDMETHOD.
METHOD save_to_host.
DATA: lv_s TYPE REF TO data.
FIELD-SYMBOLS: <lv_s> TYPE any.
CREATE DATA lv_s LIKE LINE OF p_table.
ASSIGN lv_s->* TO <lv_s>.
CHECK NOT me->filename IS INITIAL.
IF me->filetype = 'BIN'.
OPEN DATASET me->filename FOR OUTPUT IN BINARY MODE.
ELSE.
OPEN DATASET me->filename FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
ENDIF.
LOOP AT p_table INTO <lv_s>.
TRANSFER <lv_s> TO me->filename.
ENDLOOP.
CLOSE DATASET me->filename.
ENDMETHOD.
ENDCLASS.
at selection-screen on value-request for filez.
perform help_me changing filez.
end-of-selection.
*--[ Ejemplo de USO
DATA: l_filez type REF TO Z_CL_FILEZ,
my_tab type STANDARD TABLE OF string.
BREAK-POINT.
CREATE OBJECT l_filez EXPORTING i_filez = filez.
l_filez->LOAD( CHANGING p_table = my_tab ).
l_filez->filename = 't:\salida.txt'.
l_filez->save( CHANGING p_table = my_tab ).
BREAK-POINT.
form help_me changing p_filez type string.
data: lv_file like rlgrap-filename.
lv_file = p_filez.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
def_filename = lv_file
mask = ',all files,*.*,data files,*.dat,text files,*.txt.'
mode = 'o'
title = 'Selecciona un fichero...'
IMPORTING
filename = lv_file
EXCEPTIONS
inv_winsys = 04
no_batch = 04
selection_cancel = 04
selection_error = 04.
p_filez = lv_file.
endform.