文件传输程序

来源:互联网 发布:局域网同步软件 编辑:程序博客网 时间:2024/05/15 03:07

*&---------------------------------------------------------------------*
*& Report  Z_TRANSFER_FILE
*&---------------------------------------------------------------------*
*&*** "本地文件上传至服务器,从服务器下载文件到本地 ***
*&*** Author: Edward Kang         Date: 20100125 ***
*&---------------------------------------------------------------------*

REPORT  z_transfer_file . "MESSAGE-ID 00

*&---------------------------------------------------------------------*
*& INTERNAL TABLES
*&---------------------------------------------------------------------*
* "文件内表
DATA: BEGIN OF itab_asc OCCURS 0,
    asc TYPE char2000,
END OF itab_asc.
DATA:  l_tab_rc    TYPE cms_tab_msg_col_message.
TYPES: l_itab_asc  LIKE itab_asc OCCURS 0.
*&---------------------------------------------------------------------*
*& SELECT-OPTIONS
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK bk1 WITH FRAME TITLE text-001.          "Model Option
SELECTION-SCREEN: SKIP 1.
PARAMETERS:  r_ltos RADIOBUTTON GROUP rad1                              "Local to Server " 上传本地文件至服务器
                                DEFAULT 'X',
             r_stol RADIOBUTTON GROUP rad1.                             "Server to Local " 从服务器下载文件到本地

SELECTION-SCREEN: SKIP 1.
PARAMETERS:  p_lfile TYPE text128                                       "Local File Path
                     DEFAULT 'C:/xxx.txt',
             p_sfile TYPE text128                                       "Server File Path
                     DEFAULT '/usr/sap/tmp/xxx.txt'.

SELECTION-SCREEN: SKIP 1.
SELECTION-SCREEN END OF BLOCK bk1.

*&---------------------------------------------------------------------*
*& AT LINE-SELECTION
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_lfile.
  PERFORM lfile_open_dialog CHANGING p_lfile.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_sfile.
  PERFORM sfile_open_dialog CHANGING p_sfile.

*&---------------------------------------------------------------------*
*& MAIN PROCESS
*&---------------------------------------------------------------------*
START-OF-SELECTION.
  PERFORM show_progress_text USING 'Processing...'.
  IF r_ltos EQ 'X'.
    PERFORM upload_localfile_to_server.
  ELSEIF r_stol EQ 'X'.
    PERFORM download_serverfile_to_local.
  ENDIF.

*----------------------------------------------------------------------*
**********                                                     *********
**********               SUBROUTIN                             *********
**********                                                     *********
*----------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*& FORM  SHOW_PROGRESS_TEXT
*&---------------------------------------------------------------------*
*  显示处理进程
*----------------------------------------------------------------------*
FORM show_progress_text USING p_text.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = 0
      text       = p_text
    EXCEPTIONS
      OTHERS     = 1.
ENDFORM.

*&---------------------------------------------------------------------*
*& FORM  DOWNLOAD_SERVERFILE_TO_LOCAL
*&---------------------------------------------------------------------*
*  TRANSFER A SAP APPLICATION SERVER FILE TO LOCAL
*----------------------------------------------------------------------*
FORM download_serverfile_to_local.
  DATA: user_answer(1) TYPE c.
  DATA: prc_result     TYPE c.
  DATA: l_text         TYPE string.
  DATA: l_filename     TYPE string.
  CLEAR: l_text.
  REFRESH itab_asc.

  OPEN DATASET p_sfile FOR INPUT IN TEXT MODE ENCODING UTF-8.           "判断服务器文件是否存在
  IF sy-subrc <> 0.
    IF sy-subrc = 8.
      l_text = |File { p_sfile } doesn't exist!|.
    ELSE.
      l_text = |File { p_sfile } open error!|.
    ENDIF.
    MESSAGE e208(00) WITH l_text.
    CLOSE DATASET p_sfile.
    EXIT.
  ENDIF.

  DO.
    READ DATASET p_sfile INTO itab_asc.
    IF sy-subrc <> 0.
      EXIT.
    ENDIF.

    APPEND itab_asc TO itab_asc.
    CLEAR  itab_asc.
  ENDDO.
  CLOSE DATASET p_sfile.

  l_filename = p_lfile.
  prc_result = cl_gui_frontend_services=>file_exist( l_filename ).      "判断本地文件是否存在
  IF prc_result IS NOT INITIAL.
    l_text = |File { p_lfile } already exists, overwrite it?|.
    CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
      EXPORTING
        textline1      = l_text
        titel          = 'Confirm'
        start_column   = 40
        start_row      = 10
        cancel_display = 'X'
      IMPORTING
        answer         = user_answer
      EXCEPTIONS
        OTHERS         = 1.

    IF user_answer EQ 'A' OR user_answer EQ 'N' .
      CLOSE DATASET p_sfile.
      STOP.
    ENDIF.

  ENDIF.

  PERFORM download_itab_2_localfile
    USING    p_lfile
    CHANGING itab_asc[]
             l_tab_rc.


  IF sy-subrc EQ 0.
    MESSAGE s208(00) WITH 'SUCCEED TO TRANSFER FILE!'.
  ELSE.
    MESSAGE e208(00) WITH 'FAIL TO TRANSFER FILE!'.
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*& FORM  UPLOAD_LOCALFILE_TO_SERVER
*&---------------------------------------------------------------------*
*  TRANSFER A LOCAL FILE TO SAP APPLICATION SERVER
*----------------------------------------------------------------------*
FORM upload_localfile_to_server.
  DATA: user_answer(1) TYPE c.
  DATA: l_text         TYPE string.
  DATA: l_filename     TYPE string.
  DATA: prc_result     TYPE c.
  CLEAR: l_text.

  l_filename = p_lfile.
  prc_result = cl_gui_frontend_services=>file_exist( l_filename ).      "判断本地文件是否存在
  IF prc_result IS INITIAL.
    l_text = |File { p_lfile } doesn't exist!|.
    MESSAGE e208(00) WITH l_text.
  ENDIF.

  OPEN DATASET p_sfile FOR INPUT IN TEXT MODE ENCODING UTF-8.           "判断服务器是否存在
  IF sy-subrc EQ 0.
    l_text = |File { p_sfile } already exists, overwrite it?|.
    CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
      EXPORTING
        textline1      = l_text
        titel          = 'Confirm'
        start_column   = 40
        start_row      = 10
        cancel_display = 'X'
      IMPORTING
        answer         = user_answer
      EXCEPTIONS
        OTHERS         = 1.

    IF user_answer EQ 'A' OR user_answer EQ 'N' .
      CLOSE DATASET p_sfile.
      STOP.
    ENDIF.
  ENDIF.
  CLOSE DATASET p_sfile.

  REFRESH itab_asc.
  PERFORM upload_localfile_2_itab
    USING    p_lfile
    CHANGING itab_asc[]
             l_tab_rc.

  OPEN DATASET p_sfile FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
  IF sy-subrc EQ 0.
    LOOP AT itab_asc.
      TRANSFER itab_asc TO p_sfile.
    ENDLOOP.
  ENDIF.
  CLOSE DATASET p_sfile.

  IF sy-subrc EQ 0.
    MESSAGE s208(00) WITH 'SUCCEED TO TRANSFER FILE!'.
  ELSE.
    MESSAGE e208(00) WITH 'FAIL TO TRANSFER FILE!'.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FILE_OPEN_DIALOG
*&---------------------------------------------------------------------*
FORM lfile_open_dialog  CHANGING c_lfile.

  DATA: l_initial_directory TYPE string.
  DATA: lt_file_table       TYPE filetable.
  DATA: l_rc                TYPE i.

  l_initial_directory = c_lfile.

  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
*     WINDOW_TITLE            =
      default_extension       = '.TXT'
*     DEFAULT_FILENAME        =
*     FILE_FILTER             =
*     WITH_ENCODING           =
      initial_directory       = l_initial_directory
*     MULTISELECTION          =
    CHANGING
      file_table              = lt_file_table
      rc                      = l_rc
*     USER_ACTION             =
*     FILE_ENCODING           =
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.

  IF sy-subrc <> 0.

    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

  ELSE.

    IF lt_file_table IS NOT INITIAL.

      READ TABLE lt_file_table INTO c_lfile INDEX 1.

    ENDIF.

  ENDIF.

ENDFORM.                    " FILE_OPEN_DIALOG
*&---------------------------------------------------------------------*
*&      Form  UPLOAD_LOCALFILE_2_ITAB
*&---------------------------------------------------------------------*
FORM upload_localfile_2_itab  USING    u_lfile     TYPE text128
                              CHANGING c_itab_asc  TYPE l_itab_asc
                                       c_tab_rc    TYPE cms_tab_msg_col_message.
  DATA: l_str_rc              TYPE cms_str_msg_col_message.

  DATA: l_file                TYPE string.
  REFRESH:
    c_itab_asc.
  l_file = u_lfile.
  CALL METHOD cl_gui_frontend_services=>gui_upload
    EXPORTING
      filename                = l_file
      filetype                = 'ASC'
*    HAS_FIELD_SEPARATOR     = 'X'
*    HEADER_LENGTH           = 0
*    READ_BY_LINE            = 'X'
*    DAT_MODE                = SPACE
*    CODEPAGE                = SPACE
      codepage                = '4110'
*    IGNORE_CERR             = ABAP_TRUE
*    REPLACEMENT             = space
*    VIRUS_SCAN_PROFILE      =
*  IMPORTING
*    FILELENGTH              =
*    HEADER                  =
    CHANGING
      data_tab                = c_itab_asc
    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 <> 0.

    DATA: l_load_error TYPE text30.

    PERFORM get_load_error
              USING    sy-subrc
                       'CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD'
              CHANGING l_load_error.

    l_str_rc-msg_class  = '00'.
    l_str_rc-msg_type   = 'E'.
    l_str_rc-msg_number = 208.
    l_str_rc-param1     = l_load_error.

    APPEND l_str_rc TO c_tab_rc.
    MESSAGE s208(00) WITH l_load_error.

  ENDIF.

ENDFORM.                    " UPLOAD_LOCALFILE_2_ITAB
*&---------------------------------------------------------------------*
*&      Form  GET_LOAD_ERROR
*&---------------------------------------------------------------------*
FORM get_load_error  USING    u_err_code   TYPE sy-subrc
                              u_prog_name  TYPE string
                     CHANGING c_load_error TYPE text30.
  CLEAR c_load_error.

  CASE u_err_code.

    WHEN 1.  c_load_error = 'FILE_OPEN_ERROR'.
    WHEN 2.  c_load_error = 'FILE_READ_ERROR'.
    WHEN 3.  c_load_error = 'NO_BATCH'.
    WHEN 4.  c_load_error = 'GUI_REFUSE_FILETRANSFER'.
    WHEN 5.  c_load_error = 'INVALID_TYPE'.
    WHEN 6.  c_load_error = 'NO_AUTHORITY'.
    WHEN 7.  c_load_error = 'UNKNOWN_ERROR'.
    WHEN 8.  c_load_error = 'BAD_DATA_FORMAT'.
    WHEN 9.  c_load_error = 'HEADER_NOT_ALLOWED'.
    WHEN 10. c_load_error = 'SEPARATOR_NOT_ALLOWED'.
    WHEN 11. c_load_error = 'HEADER_TOO_LONG'.
    WHEN 12. c_load_error = 'UNKNOWN_DP_ERROR'.
    WHEN 13. c_load_error = 'ACCESS_DENIED'.
    WHEN 14. c_load_error = 'DP_OUT_OF_MEMORY'.
    WHEN 15. c_load_error = 'DISK_FULL'.
    WHEN 16. c_load_error = 'DP_TIMEOUT'.
    WHEN 17. c_load_error = 'NOT_SUPPORTED_BY_GUI'.
    WHEN 18. c_load_error = 'RROR_NO_GUI'.
    WHEN 19. c_load_error = 'others'.

  ENDCASE.

  IF c_load_error IS INITIAL.
    c_load_error = u_err_code.
  ELSE.
    c_load_error = |ERROR { c_load_error } CALL OF { u_prog_name }|.
  ENDIF.

ENDFORM.                    " GET_LOAD_ERROR
*&---------------------------------------------------------------------*
*&      Form  DOWNLOAD_SEVERFILE_2_ITAB
*&---------------------------------------------------------------------*
FORM download_itab_2_localfile  USING    u_lfile     TYPE text128
                                CHANGING c_itab_asc  TYPE l_itab_asc
                                         c_tab_rc    TYPE cms_tab_msg_col_message.
  DATA: l_str_rc              TYPE cms_str_msg_col_message.

  DATA: l_file                TYPE string.
  REFRESH:
    c_tab_rc.
  l_file = u_lfile.
  CALL METHOD cl_gui_frontend_services=>gui_download
    EXPORTING
*      bin_filesize              =
      filename                  = l_file
      filetype                  = 'ASC'
*     append                    = 'X'
*      write_field_separator     = space
*      header                    = '00'
*      trunc_trailing_blanks     = SPACE
*      write_lf                  = 'X'
*      col_select                = SPACE
*      col_select_mask           = SPACE
*      dat_mode                  = SPACE
*      confirm_overwrite         = SPACE
*      no_auth_check             = SPACE
       codepage                  = '4110'
*      ignore_cerr               = ABAP_TRUE
*      replacement               = '#'
*      write_bom                 = SPACE
*      trunc_trailing_blanks_eol = 'X'
*      wk1_n_format              = SPACE
*      wk1_n_size                = SPACE
*      wk1_t_format              = SPACE
*      wk1_t_size                = SPACE
*      show_transfer_status      = 'X'
*    IMPORTING
*      filelength                =
    CHANGING
      data_tab                  = c_itab_asc
    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
      .

  IF sy-subrc <> 0.

    DATA: l_load_error TYPE text30.

    PERFORM get_load_error2
              USING    sy-subrc
                       'CL_GUI_FRONTEND_SERVICES=>GUI_DOWNLOAD'
              CHANGING l_load_error.

    l_str_rc-msg_class  = '00'.
    l_str_rc-msg_type   = 'E'.
    l_str_rc-msg_number = 208.
    l_str_rc-param1     = l_load_error.

    APPEND l_str_rc TO c_tab_rc.
    MESSAGE s208(00) WITH l_load_error.

  ENDIF.

ENDFORM.                    " DOWNLOAD_SEVERFILE_2_ITAB
*&---------------------------------------------------------------------*
*&      Form  GET_LOAD_ERROR2
*&---------------------------------------------------------------------*
FORM get_load_error2  USING   u_err_code   TYPE sy-subrc
                              u_prog_name  TYPE string
                     CHANGING c_load_error TYPE text30.
  CLEAR c_load_error.

  CASE u_err_code.
    WHEN 1.  c_load_error = 'FILE_WRITE_ERROR'.
    WHEN 2.  c_load_error = 'NO_BATCH'.
    WHEN 3.  c_load_error = 'GUI_REFUSE_FILETRANSFER'.
    WHEN 4.  c_load_error = 'INVALID_TYPE'.
    WHEN 5.  c_load_error = 'NO_AUTHORITY'.
    WHEN 6.  c_load_error = 'UNKNOWN_ERROR'.
    WHEN 7.  c_load_error = 'HEADER_NOT_ALLOWED'.
    WHEN 8.  c_load_error = 'SEPARATOR_NOT_ALLOWED'.
    WHEN 9.  c_load_error = 'FILESIZE_NOT_ALLOWED'.
    WHEN 10. c_load_error = 'HEADER_TOO_LONG'.
    WHEN 11. c_load_error = 'DP_ERROR_CREATE'.
    WHEN 12. c_load_error = 'DP_ERROR_SEND'.
    WHEN 13. c_load_error = 'DP_ERROR_WRITE'.
    WHEN 14. c_load_error = 'UNKNOWN_DP_ERROR'.
    WHEN 15. c_load_error = 'ACCESS_DENIED'.
    WHEN 16. c_load_error = 'DP_OUT_OF_MEMORY'.
    WHEN 17. c_load_error = 'DISK_FULL'.
    WHEN 18. c_load_error = 'DP_TIMEOUT'.
    WHEN 19. c_load_error = 'FILE_NOT_FOUND'.
    WHEN 20. c_load_error = 'DATAPROVIDER_EXCEPTION'.
    WHEN 21. c_load_error = 'CONTROL_FLUSH_ERROR'.
    WHEN 22. c_load_error = 'NOT_SUPPORTED_BY_GUI'.
    WHEN 23. c_load_error = 'ERROR_NO_GUI'.
    WHEN 24. c_load_error = 'OTHERS '.

  ENDCASE.

  IF c_load_error IS INITIAL.
    c_load_error = u_err_code.
  ELSE.
    c_load_error = |ERROR { c_load_error } CALL OF { u_prog_name }|.
  ENDIF.

ENDFORM.                    " GET_LOAD_ERROR2
*&---------------------------------------------------------------------*
*&      Form  SFILE_OPEN_DIALOG
*&---------------------------------------------------------------------*
FORM sfile_open_dialog  CHANGING c_sfile.
  DATA: l_directory  TYPE string VALUE '/'.
  DATA: l_filemask   TYPE char1.
  DATA: l_serverfile TYPE string.

  IF c_sfile IS NOT INITIAL.
    l_directory = c_sfile.
  ENDIF.
  CALL FUNCTION '/SAPDMC/LSM_F4_SERVER_FILE'
    EXPORTING
      directory        = l_directory
    IMPORTING
      serverfile       = l_serverfile
    EXCEPTIONS
      canceled_by_user = 1
      OTHERS           = 2.

  IF sy-subrc <> 0.

    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

  ELSE.

    c_sfile = l_serverfile.

  ENDIF.

ENDFORM.                    " SFILE_OPEN_DIALOG

原创粉丝点击