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.
CLASS zcl_file_main DEFINITION.
PUBLIC SECTION.
CONSTANTS: c_version TYPE string VALUE '01.02',
c_err_empty type sysubrc value 1, "Error tabla vacía
c_err_no_file_found type sysubrc value 100, "100 + RAISE
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[
c_constant_empty(1) value abap_true.
METHODS:
load CHANGING p_table TYPE table,
save CHANGING p_table TYPE table,
delete,
help_me IMPORTING i_mask TYPE string OPTIONAL CHANGING i_filez TYPE string,
constructor IMPORTING i_filez TYPE string OPTIONAL,
set_asc,
set_filename IMPORTING i_file TYPE string,
set_server,
set_local,
set_bin,
get_filesize RETURNING VALUE(p_size) TYPE i,
set_filesize IMPORTING p_size TYPE i,
get_split_name RETURNING VALUE(p_name) type string,
get_split_ext RETURNING VALUE(p_name) type string,
get_split_dir RETURNING VALUE(p_name) type string,
get_subrc RETURNING VALUE(rc) TYPE sysubrc.
PRIVATE SECTION.
CONSTANTS: c_bin TYPE char10 VALUE 'BIN',
c_asc TYPE char10 VALUE 'ASC',
c_all_files TYPE char10 VALUE '*.*'.
DATA: filetype TYPE char10,
filename TYPE string,
to_from_pc TYPE xfeld,
to_from_host TYPE xfeld,
filesize TYPE i,
subrc TYPE sy-subrc,
split_name TYPE string,
split_dir TYPE string,
split_ext type string,
i_dummy.
METHODS:
split_filename,
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,
save_dialog,
open_dialog.
ENDCLASS.
CLASS zcl_file_main IMPLEMENTATION.
*--[ Encapsulation
METHOD get_filesize. p_size = me->filesize. ENDMETHOD.
METHOD set_filesize. me->filesize = p_size. ENDMETHOD.
METHOD get_subrc. rc = me->subrc. ENDMETHOD.
METHOD set_filename. me->filename = i_file. ENDMETHOD.
METHOD set_asc. me->filetype = c_ASC. ENDMETHOD.
METHOD set_bin. me->filetype = c_BIN. ENDMETHOD.
METHOD set_SERvER. Me->to_from_pc = abap_false. me->to_from_host = abap_true. ENDMETHOD.
METHOD set_LOCAL. Me->to_from_pc = abap_true. me->to_from_host = abap_false. ENDMETHOD.
method get_split_name. " RETURNING VALUE(p_name) type string,
p_name = me->split_name.
endmethod.
method get_split_dir. " RETURNING VALUE(p_name) type string,
p_name = me->split_dir.
endmethod.
method get_split_ext. " RETURNING VALUE(p_name) type string,
p_name = me->split_ext.
endmethod.
METHOD split_filename.
CLEAR: split_ext, split_dir, split_name.
CASE abap_true.
WHEN me->to_from_pc. DATA(l_sep) = '\'.
WHEN me->to_from_host. l_sep = '/'.
ENDCASE.
DATA(l_lcl) = translate( val = me->filename from = '/' to = '\' ).
SPLIT l_lcl AT '\' INTO TABLE DATA(T_tab).
DATA(l_tabix) = lines( t_tab ).
LOOP AT t_tab INTO DATA(l_tab).
IF sy-tabix NE l_tabix.
split_dir = |{ split_dir }{ l_sep }{ l_tab }|.
ELSE.
split l_tab at '.' into table data(t_tav).
split_name = l_tab.
split_ext = t_tav[ lines( t_tav ) ].
ENDIF.
ENDLOOP.
split_dir = replace( val = split_dir sub ='//' with = '/' occ = 0 ).
split_dir = replace( val = split_dir sub ='\\' with = '\' occ = 0 ).
ENDMETHOD.
METHOD constructor.
IF NOT i_filez IS INITIAL.
me->set_filename( i_filez ).
me->split_filename( ).
ENDIF.
me->set_asc( ). "<- Por defecto siempre en ASCII
me->set_local( ).
ENDMETHOD.
METHOD load.
refresh p_table. "<-- Clean
split_filename( ).
CASE abap_true.
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.
split_filename( ).
CASE abap_true.
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 delete.
CHECK me->filename IS NOT INITIAL.
CASE abap_true.
WHEN me->to_from_pc.
DATA: e_Rc TYPE i.
CALL METHOD cl_gui_frontend_services=>file_delete
EXPORTING
filename = me->filename
CHANGING
rc = e_Rc
EXCEPTIONS
file_delete_failed = 1
cntl_error = 2
error_no_gui = 3
file_not_found = 4
access_denied = 5
unknown_error = 6
not_supported_by_gui = 7
wrong_parameter = 8
OTHERS = 9.
if sy-subrc ne 0.
me->subrc = c_err_no_file_found + sy-subrc.
endif.
WHEN me->to_from_host. DELETE DATASET me->filename.
if sy-subrc ne 0.
me->subrc = c_err_no_file_found + sy-subrc.
endif.
ENDCASE.
ENDMETHOD.
METHOD save_dialog.
DATA: l_01 TYPE string,
l_02 TYPE string,
l_03 TYPE string.
IF me->filename IS INITIAL.
cl_gui_frontend_services=>file_save_dialog(
EXPORTING
window_title = 'Fichero a descargar'
* default_extension =
* default_file_name =
* with_encoding =
* file_filter =
* initial_directory =
* prompt_on_overwrite = 'X'
CHANGING
filename = l_01
path = l_02
fullpath = l_03
* user_action =
* file_encoding =Q
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
invalid_default_file_name = 4
OTHERS = 5
).
me->subrc = sy-subrc.
IF me->subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ELSE.
me->filename = l_03.
ENDIF.
ENDIF.
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
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.
me->subrc = sy-subrc.
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
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.
if sy-subrc ne 0.
me->subrc = c_err_no_file_found + sy-subrc.
endif.
ENDMETHOD.
METHOD: save_to_pc.
if p_table is INITIAL.
me->subrc = c_err_empty.
exit.
endif.
me->save_dialog( ).
CHECK sy-subrc EQ 0.
IF me->filetype NE c_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.
me->subrc = sy-subrc.
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 = c_BIN.
OPEN DATASET me->filename FOR INPUT IN LEGACY BINARY MODE IGNORING CONVERSION ERRORS.
ELSE.
OPEN DATASET me->filename FOR INPUT IN TEXT MODE ENCODING DEFAULT IGNORING CONVERSION ERRORS.
ENDIF.
if sy-subrc ne 0.
me->subrc = c_err_no_file_found + sy-subrc.
exit.
endif.
clear sy-subrc.
while sy-subrc eq 0.
READ DATASET me->filename INTO <lv_s>.
APPEND <lv_s> TO p_table.
endwhile.
CLOSE DATASET me->filename.
*--[ Recuperemos los atributos de lectura
DATA: iv_long_file_name TYPE eps2filnam,
iv_long_dir_name TYPE eps2path,
l_size TYPE p.
IF sy-subrc EQ 0.
iv_long_file_name = me->split_name.
iv_long_dir_name = me->split_dir.
CALL FUNCTION 'EPS_GET_FILE_ATTRIBUTES'
EXPORTING
iv_long_file_name = iv_long_file_name
iv_long_dir_name = iv_long_dir_name
IMPORTING
* file_size = l_size
* FILE_OWNER =
* FILE_MODE =
* FILE_TYPE =
* FILE_MTIME =
FILE_SIZE_LONG = l_size
EXCEPTIONS
read_directory_failed = 1
read_attributes_failed = 2
OTHERS = 3.
IF sy-subrc EQ 0.
me->filesize = l_size.
else.
me->subrc = c_err_no_file_found + sy-subrc.
ENDIF.
ENDIF.
ENDMETHOD.
METHOD save_to_host.
DATA: lv_s TYPE REF TO data,
l_x type xstring.
FIELD-SYMBOLS: <lv_s> TYPE any.
if p_table is INITIAL.
me->subrc = c_err_empty.
exit.
endif.
CREATE DATA lv_s LIKE LINE OF p_table.
ASSIGN lv_s->* TO <lv_s>.
CHECK NOT me->filename IS INITIAL.
IF me->filetype = c_BIN.
OPEN DATASET me->filename FOR OUTPUT IN BINARY MODE.
ELSE.
OPEN DATASET me->filename FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
ENDIF.
me->subrc = sy-subrc.
CHECK sy-subrc EQ 0.
IF me->filetype = c_BIN.
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
EXPORTING
input_length = me->filesize
IMPORTING
BUFFER = l_x
tables
binary_tab = p_table
EXCEPTIONS
FAILED = 1
OTHERS = 2
.
IF sy-subrc eq 0.
TRANSFER l_x to me->filename.
ENDIF.
else.
LOOP AT p_table INTO <lv_s>.
TRANSFER <lv_s> TO me->filename.
ENDLOOP.
endif.
CLOSE DATASET me->filename.
ENDMETHOD.
METHOD help_me.
CASE abap_true.
WHEN me->to_from_pc. me->open_dialog( ). i_filez = me->filename.
WHEN me->to_from_host.
CALL FUNCTION '/SAPDMC/LSM_F4_SERVER_FILE'
EXPORTING
directory = CONV file_name( i_filez )
filemask = COND string( WHEN i_mask IS INITIAL THEN c_all_files ELSE i_mask )
IMPORTING
serverfile = i_filez
EXCEPTIONS
canceled_by_user = 1
OTHERS = 2.
me->subrc = sy-subrc.
ENDCASE.
ENDMETHOD.
ENDCLASS.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR filez.
*--[ Ejemplo de USO en F4 de pantalla
DATA(lcl) = NEW zcl_file_main( ).
* lcl->set_server( ).
lcl->help_me( CHANGING i_filez = filez ).
end-of-selection.
*--[ Ejemplo de USO
DATA: l_filez TYPE REF TO zcl_file_main,
my_tab TYPE STANDARD TABLE OF string.
l_filez = NEW zcl_file_main( i_filez = filez ).
* l_filez->set_local( ). " Ya vienen por defecto en el construtor
* l_filez->set_asc( ). " Ya vienen por defecto en el construtor
l_filez->load( CHANGING p_table = my_tab ).
l_filez->set_filename( 't:\salida.txt' ).
* l_filez->save( CHANGING p_table = my_tab ).
IF l_filez->get_subrc( ) IS INITIAL.
*--[ Todo ha ido bien.
ENDIF.