- 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.
Última modificación de la página el 03 May 2026 a las 07h16
Powered by
PmWiki