SAP/ABAP 코드

(ABAP 코드) EXCEL_DOWNLOAD(SWM0)

haramang 2022. 2. 8. 05:56

*&---------------------------------------------------------------------*
*& Form EXCEL_DOWNLOAD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM excel_download USING VALUE(pv_docname).

  DATA: lt_doc_table TYPE TABLE OF w3mime,
        ls_doc_table TYPE w3mime.

  DATA: lv_doc_size   TYPE i,
        lv_doc_type   TYPE c LENGTH 80 VALUE 'Excel.Sheet',
        lv_doc_format TYPE c LENGTH 80.

  DATA: lv_filename_1 TYPE string,
        lv_filename_2 TYPE c LENGTH 100.


* 저장할 파일 이름 생성
  DATA: lv_key     TYPE w3objid.
  DATA: lv_key_1   TYPE sy-repid.
  DATA: lv_key_2   TYPE sy-datum.

  lv_key = '비용 처리 계획 업로드 양식'.

* 2진 파일로 다운로드
* SMW0에 올려 놓은 비용계회처리 객체를 등록하여, 사이즈, 형태, 타입과 테이블을 받음.
  CALL FUNCTION 'SAP_OI_LOAD_MIME_DATA'
    EXPORTING
      object_id        = pv_docname
    IMPORTING
      data_size        = lv_doc_size
      document_type    = lv_doc_format
      document_format  = lv_doc_type
    TABLES
      data_table       = lt_doc_table
    EXCEPTIONS
      object_not_found = 1
      internal_error   = 2
      OTHERS           = 3.

* 해당 엑셀양식의 데이터 구조를 파악하는데 실패했을 경우, 에러
  IF sy-subrc <> 0.
    MESSAGE e000 WITH '엑셀양식 구조를 파악하는데 실패하였습니다.'.
  ENDIF.

* 파일이름 지정
  CONCATENATE lv_key '.xlsx' INTO lv_filename_1.

* PC에 저장할 위치를 가져와서 파일경로를 만듬
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_filename     = lv_filename_1
      def_path         = 'C:\'    " 최조 경로 - C Drive
      mask             = ',*.xlsx,*XLSX.'
      mode             = 'S'
      title            = ' '
    IMPORTING
      filename         = lv_filename_2
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.

  IF sy-subrc EQ 0.
    lv_filename_1 = lv_filename_2.
  ELSEIF sy-subrc EQ 3.
    MESSAGE e000 WITH '파일 업로드를 취소하셨습니다.'.
  ELSE.
    MESSAGE e000 WITH '파일 업로드에 실패하였습니다.'.
  ENDIF.

  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      bin_filesize            = lv_doc_size
      filename                = lv_filename_1
      filetype                = 'BIN'
    TABLES
      data_tab                = lt_doc_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
      OTHERS                  = 22.

* 실패
  IF sy-subrc EQ 0.
    MESSAGE s000 WITH '비용처리 계획 양식 다운로드에 성공하였습니다.'.
  ELSEIF sy-subrc EQ 19.
    MESSAGE e000 WITH '파일을 찾을 수 없습니다..'.
  ELSE.
    MESSAGE e000 WITH '비용처리 계획 양식 다운로드에 실패하였습니다.'.
  ENDIF.

ENDFORM.