ABAP Rut Externos

  1. REPORT znadar_file_subr.
  2.  
  3. SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME.
  4.   PARAMETER: filez TYPE string LOWER CASE,
  5.              f_pc RADIOBUTTON GROUP bol,
  6.              f_ho RADIOBUTTON GROUP bol.
  7. SELECTION-SCREEN END OF BLOCK b01.
  8.  
  9.  
  10. CLASS zcl_file_main DEFINITION.
  11.  
  12.   PUBLIC SECTION.
  13.  
  14.     CONSTANTS: c_version TYPE string VALUE '01.02',
  15.  
  16.                c_err_empty             type sysubrc value 1, "Error tabla vacía
  17.                c_err_no_file_found     type sysubrc value 100, "100 + RAISE
  18.  
  19. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  20. *--[
  21.                c_constant_empty(1) value abap_true.
  22.  
  23.     METHODS:
  24.       load CHANGING p_table TYPE table,
  25.       save CHANGING p_table TYPE table,
  26.       delete,
  27.       help_me IMPORTING i_mask TYPE string OPTIONAL CHANGING i_filez TYPE string,
  28.       constructor IMPORTING i_filez TYPE string OPTIONAL,
  29.  
  30.       set_asc,
  31.       set_filename IMPORTING i_file TYPE string,
  32.       set_server,
  33.       set_local,
  34.       set_bin,
  35.  
  36.       get_filesize   RETURNING VALUE(p_size) TYPE i,
  37.       set_filesize   IMPORTING p_size TYPE i,
  38.       get_split_name RETURNING VALUE(p_name) type string,
  39.       get_split_ext  RETURNING VALUE(p_name) type string,
  40.       get_split_dir  RETURNING VALUE(p_name) type string,
  41.       get_subrc      RETURNING VALUE(rc)     TYPE sysubrc.
  42.  
  43.   PRIVATE SECTION.
  44.  
  45.     CONSTANTS: c_bin       TYPE char10 VALUE 'BIN',
  46.                c_asc       TYPE char10 VALUE 'ASC',
  47.                c_all_files TYPE char10 VALUE '*.*'.
  48.  
  49.     DATA: filetype     TYPE char10,
  50.           filename     TYPE string,
  51.           to_from_pc   TYPE xfeld,
  52.           to_from_host TYPE xfeld,
  53.           filesize     TYPE i,
  54.           subrc        TYPE sy-subrc,
  55.           split_name   TYPE string,
  56.           split_dir    TYPE string,
  57.           split_ext    type string,
  58.  
  59.           i_dummy.
  60.  
  61.     METHODS:
  62.       split_filename,
  63.       load_from_pc CHANGING p_table TYPE table,
  64.       load_from_host CHANGING p_table TYPE table,
  65.       save_to_pc CHANGING p_table TYPE table,
  66.       save_to_host CHANGING p_table TYPE table,
  67.       save_dialog,
  68.       open_dialog.
  69. ENDCLASS.
  70.  
  71. CLASS zcl_file_main IMPLEMENTATION.
  72.  
  73. *--[ Encapsulation
  74.   METHOD get_filesize. p_size = me->filesize. ENDMETHOD.
  75.   METHOD set_filesize. me->filesize = p_size. ENDMETHOD.
  76.   METHOD get_subrc. rc = me->subrc. ENDMETHOD.
  77.   METHOD set_filename. me->filename = i_file. ENDMETHOD.
  78.   METHOD set_asc. me->filetype = c_ASC. ENDMETHOD.
  79.   METHOD set_bin. me->filetype = c_BIN. ENDMETHOD.
  80.   METHOD set_SERvER. Me->to_from_pc = abap_false. me->to_from_host = abap_true. ENDMETHOD.
  81.   METHOD set_LOCAL. Me->to_from_pc = abap_true. me->to_from_host = abap_false. ENDMETHOD.
  82.  
  83.  
  84. method get_split_name. " RETURNING VALUE(p_name) type string,
  85.   p_name = me->split_name.
  86. endmethod.
  87.  
  88. method get_split_dir. " RETURNING VALUE(p_name) type string,
  89.   p_name = me->split_dir.
  90. endmethod.
  91.  
  92. method get_split_ext. " RETURNING VALUE(p_name) type string,
  93.   p_name = me->split_ext.
  94. endmethod.
  95.  
  96.   METHOD split_filename.
  97.     CLEAR: split_ext, split_dir, split_name.
  98.     CASE abap_true.
  99.       WHEN me->to_from_pc.   DATA(l_sep) = '\'.
  100.       WHEN me->to_from_host. l_sep = '/'.
  101.     ENDCASE.
  102.  
  103.     DATA(l_lcl) = translate( val = me->filename from = '/' to = '\' ).
  104.     SPLIT l_lcl AT '\' INTO TABLE DATA(T_tab).
  105.     DATA(l_tabix) = lines( t_tab ).
  106.     LOOP AT t_tab INTO DATA(l_tab).
  107.       IF sy-tabix NE l_tabix.
  108.          split_dir = |{ split_dir }{ l_sep }{ l_tab }|.
  109.       ELSE.
  110.         split l_tab at '.' into table data(t_tav).
  111.         split_name = l_tab.
  112.         split_ext  = t_tav[ lines( t_tav ) ].
  113.       ENDIF.
  114.     ENDLOOP.
  115.     split_dir = replace( val = split_dir sub ='//' with = '/' occ = 0 ).
  116.     split_dir = replace( val = split_dir sub ='\\' with = '\' occ = 0 ).
  117.   ENDMETHOD.
  118.  
  119.   METHOD constructor.
  120.     IF NOT i_filez IS INITIAL.
  121.       me->set_filename( i_filez ).
  122.       me->split_filename( ).
  123.     ENDIF.
  124.     me->set_asc( ). "<- Por defecto siempre en ASCII
  125.     me->set_local( ).
  126.   ENDMETHOD.
  127.  
  128.   METHOD load.
  129.     refresh p_table. "<-- Clean
  130.     split_filename( ).
  131.     CASE abap_true.
  132.       WHEN me->to_from_pc.   me->load_from_pc( CHANGING p_table = p_table ).
  133.       WHEN me->to_from_host. me->load_from_host( CHANGING p_table = p_table ).
  134.     ENDCASE.
  135.   ENDMETHOD.
  136.  
  137.   METHOD save.
  138.     split_filename( ).
  139.     CASE abap_true.
  140.       WHEN me->to_from_pc.   me->save_to_pc( CHANGING p_table = p_table ).
  141.       WHEN me->to_from_host. me->save_to_host( CHANGING p_table = p_table ).
  142.     ENDCASE.
  143.   ENDMETHOD.
  144.  
  145.   METHOD delete.
  146.     CHECK me->filename IS NOT INITIAL.
  147.     CASE abap_true.
  148.       WHEN me->to_from_pc.
  149.         DATA: e_Rc TYPE i.
  150.         CALL METHOD cl_gui_frontend_services=>file_delete
  151.           EXPORTING
  152.             filename             = me->filename
  153.           CHANGING
  154.             rc                   = e_Rc
  155.           EXCEPTIONS
  156.             file_delete_failed   = 1
  157.             cntl_error           = 2
  158.             error_no_gui         = 3
  159.             file_not_found       = 4
  160.             access_denied        = 5
  161.             unknown_error        = 6
  162.             not_supported_by_gui = 7
  163.             wrong_parameter      = 8
  164.             OTHERS               = 9.
  165.  
  166.         if sy-subrc ne 0.
  167.            me->subrc = c_err_no_file_found + sy-subrc.
  168.         endif.
  169.  
  170.       WHEN me->to_from_host. DELETE DATASET me->filename.
  171.                              if sy-subrc ne 0.
  172.                                 me->subrc = c_err_no_file_found + sy-subrc.
  173.                              endif.
  174.     ENDCASE.
  175.   ENDMETHOD.
  176.  
  177.   METHOD save_dialog.
  178.     DATA: l_01 TYPE string,
  179.           l_02 TYPE string,
  180.           l_03 TYPE string.
  181.     IF me->filename IS INITIAL.
  182.       cl_gui_frontend_services=>file_save_dialog(
  183.       EXPORTING
  184.         window_title              = 'Fichero a descargar'
  185. *        default_extension         =
  186. *        default_file_name         =
  187. *        with_encoding             =
  188. *        file_filter               =
  189. *        initial_directory         =
  190. *        prompt_on_overwrite       = 'X'
  191.         CHANGING
  192.           filename                  = l_01
  193.           path                      = l_02
  194.           fullpath                  = l_03
  195. *        user_action               =
  196. *        file_encoding             =Q
  197.         EXCEPTIONS
  198.           cntl_error                = 1
  199.           error_no_gui              = 2
  200.           not_supported_by_gui      = 3
  201.           invalid_default_file_name = 4
  202.           OTHERS                    = 5
  203.       ).
  204.       me->subrc = sy-subrc.
  205.       IF me->subrc <> 0.
  206. *     MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
  207. *       WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  208.       ELSE.
  209.         me->filename = l_03.
  210.       ENDIF.
  211.  
  212.     ENDIF.
  213.   ENDMETHOD.
  214.  
  215.   METHOD open_dialog.
  216.     DATA: lv_file_table TYPE filetable,
  217.           lv_rc         TYPE i.
  218.     IF me->filename IS INITIAL.
  219.       CALL METHOD cl_gui_frontend_services=>file_open_dialog
  220.         CHANGING
  221.           file_table              = lv_file_table
  222.           rc                      = lv_rc
  223.         EXCEPTIONS
  224.           file_open_dialog_failed = 1
  225.           cntl_error              = 2
  226.           error_no_gui            = 3
  227.           not_supported_by_gui    = 4
  228.           OTHERS                  = 5.
  229.       me->subrc = sy-subrc.
  230.       READ TABLE lv_file_table INTO me->filename INDEX 1.
  231.  
  232.     ENDIF.
  233.   ENDMETHOD.
  234.  
  235.   METHOD: load_from_pc.
  236.     me->open_dialog( ).
  237.     CHECK sy-subrc EQ 0.
  238.  
  239.     CALL METHOD cl_gui_frontend_services=>gui_upload
  240.       EXPORTING
  241.         filename                = me->filename
  242.         filetype                = me->filetype
  243.       IMPORTING
  244.         filelength              = me->filesize
  245.       CHANGING
  246.         data_tab                = p_table
  247.       EXCEPTIONS
  248.         file_open_error         = 1
  249.         file_read_error         = 2
  250.         no_batch                = 3
  251.         gui_refuse_filetransfer = 4
  252.         invalid_type            = 5
  253.         no_authority            = 6
  254.         unknown_error           = 7
  255.         bad_data_format         = 8
  256.         header_not_allowed      = 9
  257.         separator_not_allowed   = 10
  258.         header_too_long         = 11
  259.         unknown_dp_error        = 12
  260.         access_denied           = 13
  261.         dp_out_of_memory        = 14
  262.         disk_full               = 15
  263.         dp_timeout              = 16
  264.         not_supported_by_gui    = 17
  265.         error_no_gui            = 18
  266.         OTHERS                  = 19.
  267.     if sy-subrc ne 0.
  268.        me->subrc = c_err_no_file_found + sy-subrc.
  269.     endif.
  270.   ENDMETHOD.
  271.  
  272.   METHOD: save_to_pc.
  273.  
  274.     if p_table is INITIAL.
  275.        me->subrc = c_err_empty.
  276.        exit.
  277.     endif.
  278.  
  279.     me->save_dialog( ).
  280.     CHECK sy-subrc EQ 0.
  281.     IF me->filetype NE c_BIN.
  282.       CLEAR me->filesize.
  283.     ENDIF.
  284.     CALL METHOD cl_gui_frontend_services=>gui_download
  285.       EXPORTING
  286.         bin_filesize            = me->filesize
  287.         filename                = me->filename
  288.         filetype                = me->filetype
  289.       IMPORTING
  290.         filelength              = me->filesize
  291.       CHANGING
  292.         data_tab                = p_table
  293.       EXCEPTIONS
  294.         file_write_error        = 1
  295.         no_batch                = 2
  296.         gui_refuse_filetransfer = 3
  297.         invalid_type            = 4
  298.         no_authority            = 5
  299.         unknown_error           = 6
  300.         header_not_allowed      = 7
  301.         separator_not_allowed   = 8
  302.         filesize_not_allowed    = 9
  303.         header_too_long         = 10
  304.         dp_error_create         = 11
  305.         dp_error_send           = 12
  306.         dp_error_write          = 13
  307.         unknown_dp_error        = 14
  308.         access_denied           = 15
  309.         dp_out_of_memory        = 16
  310.         disk_full               = 17
  311.         dp_timeout              = 18
  312.         file_not_found          = 19
  313.         dataprovider_exception  = 20
  314.         control_flush_error     = 21
  315.         not_supported_by_gui    = 22
  316.         error_no_gui            = 23
  317.         OTHERS                  = 24.
  318.     me->subrc = sy-subrc.
  319.   ENDMETHOD.
  320.  
  321.  
  322.   METHOD load_from_host.
  323.     DATA: lv_s TYPE REF TO data.
  324.     FIELD-SYMBOLS: <lv_s> TYPE any.
  325.  
  326.     CREATE DATA lv_s LIKE LINE OF p_table.
  327.     ASSIGN lv_s->* TO <lv_s>.
  328.  
  329.     CHECK NOT me->filename IS INITIAL.
  330.     IF me->filetype = c_BIN.
  331.       OPEN DATASET me->filename FOR INPUT IN LEGACY BINARY MODE IGNORING CONVERSION ERRORS.
  332.     ELSE.
  333.       OPEN DATASET me->filename FOR INPUT IN TEXT MODE ENCODING DEFAULT IGNORING CONVERSION ERRORS.
  334.     ENDIF.
  335.     if sy-subrc ne 0.
  336.        me->subrc = c_err_no_file_found + sy-subrc.
  337.        exit.
  338.     endif.
  339.     clear sy-subrc.
  340.     while sy-subrc eq 0.
  341.       READ DATASET me->filename INTO <lv_s>.
  342.       APPEND <lv_s> TO p_table.
  343.     endwhile.
  344.     CLOSE DATASET me->filename.
  345. *--[ Recuperemos los atributos de lectura
  346.     DATA: iv_long_file_name TYPE eps2filnam,
  347.           iv_long_dir_name  TYPE  eps2path,
  348.           l_size            TYPE p.
  349.  
  350.     IF sy-subrc EQ 0.
  351.       iv_long_file_name = me->split_name.
  352.       iv_long_dir_name  = me->split_dir.
  353.  
  354.       CALL FUNCTION 'EPS_GET_FILE_ATTRIBUTES'
  355.         EXPORTING
  356.           iv_long_file_name      = iv_long_file_name
  357.           iv_long_dir_name       = iv_long_dir_name
  358.         IMPORTING
  359. *          file_size              = l_size
  360. *         FILE_OWNER             =
  361. *         FILE_MODE              =
  362. *         FILE_TYPE              =
  363. *         FILE_MTIME             =
  364.          FILE_SIZE_LONG         = l_size
  365.         EXCEPTIONS
  366.           read_directory_failed  = 1
  367.           read_attributes_failed = 2
  368.           OTHERS                 = 3.
  369.  
  370.       IF sy-subrc EQ 0.
  371.         me->filesize = l_size.
  372.       else.
  373.         me->subrc = c_err_no_file_found + sy-subrc.
  374.       ENDIF.
  375.     ENDIF.
  376.  
  377.   ENDMETHOD.
  378.  
  379.   METHOD save_to_host.
  380.     DATA: lv_s TYPE REF TO data,
  381.           l_x type xstring.
  382.     FIELD-SYMBOLS: <lv_s> TYPE any.
  383.     if p_table is INITIAL.
  384.        me->subrc = c_err_empty.
  385.        exit.
  386.     endif.
  387.     CREATE DATA lv_s LIKE LINE OF p_table.
  388.     ASSIGN lv_s->* TO <lv_s>.
  389.  
  390.     CHECK NOT me->filename IS INITIAL.
  391.     IF me->filetype = c_BIN.
  392.       OPEN DATASET me->filename FOR OUTPUT IN BINARY MODE.
  393.     ELSE.
  394.       OPEN DATASET me->filename FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
  395.     ENDIF.
  396.     me->subrc = sy-subrc.
  397.     CHECK sy-subrc EQ 0.
  398.     IF me->filetype = c_BIN.
  399.        CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
  400.          EXPORTING
  401.            input_length       = me->filesize
  402.         IMPORTING
  403.           BUFFER             = l_x
  404.          tables
  405.            binary_tab         = p_table
  406.         EXCEPTIONS
  407.           FAILED             = 1
  408.           OTHERS             = 2
  409.                  .
  410.        IF sy-subrc eq 0.
  411.           TRANSFER l_x to  me->filename.
  412.        ENDIF.
  413.  
  414.     else.
  415.     LOOP AT p_table INTO <lv_s>.
  416.       TRANSFER <lv_s> TO me->filename.
  417.     ENDLOOP.
  418.     endif.
  419.     CLOSE DATASET me->filename.
  420.   ENDMETHOD.
  421.  
  422.   METHOD help_me.
  423.     CASE abap_true.
  424.       WHEN me->to_from_pc. me->open_dialog( ). i_filez = me->filename.
  425.       WHEN me->to_from_host.
  426.         CALL FUNCTION '/SAPDMC/LSM_F4_SERVER_FILE'
  427.           EXPORTING
  428.             directory        = CONV file_name( i_filez )
  429.             filemask         = COND string( WHEN i_mask IS INITIAL THEN c_all_files ELSE i_mask )
  430.           IMPORTING
  431.             serverfile       = i_filez
  432.           EXCEPTIONS
  433.             canceled_by_user = 1
  434.             OTHERS           = 2.
  435.         me->subrc = sy-subrc.
  436.  
  437.     ENDCASE.
  438.  
  439.   ENDMETHOD.
  440.  
  441. ENDCLASS.
  442.  
  443. AT SELECTION-SCREEN ON VALUE-REQUEST FOR filez.
  444.  
  445. *--[ Ejemplo de USO en F4 de pantalla
  446.   DATA(lcl) = NEW zcl_file_main( ).
  447. *  lcl->set_server( ).
  448.   lcl->help_me( CHANGING i_filez = filez ).
  449.  
  450. end-of-selection.
  451.  
  452. *--[ Ejemplo de USO
  453.   DATA: l_filez TYPE REF TO zcl_file_main,
  454.         my_tab  TYPE STANDARD TABLE OF string.
  455.  
  456.   l_filez = NEW zcl_file_main( i_filez = filez ).
  457. *  l_filez->set_local( ). " Ya vienen por defecto en el construtor
  458. *  l_filez->set_asc( ).   " Ya vienen por defecto en el construtor
  459.   l_filez->load( CHANGING p_table = my_tab ).
  460.   l_filez->set_filename( 't:\salida.txt' ).
  461. *  l_filez->save( CHANGING p_table = my_tab ).
  462.   IF l_filez->get_subrc( ) IS INITIAL.
  463. *--[ Todo ha ido bien.
  464.   ENDIF.