SAP/ABAP 코드

(ABAP 코드) Excel Upload

haramang 2022. 2. 8. 06:19
*&---------------------------------------------------------------------*
*& Form GET_FILE_PATH
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM get_file_path .

  DATA: ls_filetab TYPE file_table,
        lt_filetab TYPE filetable,
        lv_rc      TYPE i.

  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    CHANGING
      file_table              = lt_filetab
      rc                      = lv_rc
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.

  IF sy-subrc NE 0.
    MESSAGE e000 WITH '해당 파일을 불러오는데 실패하였습니다.'.
  ENDIF.

  READ TABLE lt_filetab INTO ls_filetab INDEX 1.

  IF sy-subrc EQ 0.
    CLEAR: p_file.
    p_file = ls_filetab-filename.
  ELSE.
    MESSAGE e000 WITH '해당 파일을 불러오는데 실패하였습니다.'.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form TRANSPORT_EXCEL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM transport_excel CHANGING pv_err TYPE char01.



  DATA: ls_intern TYPE alsmex_tabline,               " 엑셀 저장 테이블
        lt_intern TYPE TABLE OF alsmex_tabline.
  DATA: lv_kstar  TYPE zted15_plan-kstar.            " 원가요소 임시저장
  DATA: lv_kostl  TYPE zted15_plan-kostl.            " 코스트센터 임시저장
  FIELD-SYMBOLS: <fs_val> TYPE any.                  " 계획 테이블 필드 값 저장용

  CLEAR: pv_err, gs_t_plan.

* 엑셀 데이터를 Internal table에 저장
  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_file
      i_begin_col             = 1
      i_begin_row             = 2
      i_end_col               = 15
      i_end_row               = 1000
    TABLES
      intern                  = lt_intern
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.

* 실패
  IF sy-subrc <> 0.
    MESSAGE s000 WITH '엑셀파일을 불러오는데 실패하였습니다.' DISPLAY LIKE 'E'.
    pv_err = 'X'.
    EXIT.
  ENDIF.


* 엑셀 업로드 데이터를 계획 테이블에 저장
  LOOP AT lt_intern INTO ls_intern.

*   현재 Col 위치에 있는 임시 계획 테이블의 필드를 fs_line 필드심볼에 지정
    ASSIGN COMPONENT ls_intern-col OF STRUCTURE gs_t_plan TO <fs_val>.

*   해당 값의 Col이 코스트센터일경우, 앞에 0을 채워 줌.
*   누락일 경우, 데이터 유효성 체크시 해당 값을 읽을 수 없음.
    IF ls_intern-col EQ 1.

      lv_kostl = ls_intern-value.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = lv_kostl
        IMPORTING
          output = lv_kostl.

      <fs_val> = lv_kostl.

*   해당 값의 Col이 원가요소일경우, 앞에 0을 채워 줌.
*   누락일 경우, 데이터 유효성 체크시 해당 값을 읽을 수 없음.
    ELSEIF ls_intern-col EQ 2.

      lv_kstar = ls_intern-value.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = lv_kstar
        IMPORTING
          output = lv_kstar.

      <fs_val> = lv_kstar.

*   해당 값의 Col이 코스트센터이거나 원가요소가 아닐경우, 숫자 필드
    ELSE.
*     금액 필드에 문자가 입력됬을 경우 대비,
      TRY.
          <fs_val> = ls_intern-value.
*       숫자필드에 문자열이 입력되었을 경우,
        CATCH cx_sy_conversion_no_number.
          <fs_val> = 0.
      ENDTRY.
    ENDIF.


*   Row의 마지막 데이터일 경우, 구분에 "계획" / 통화에 "USD" 세팅
*   임시 계획 테이블에 데이터 저장
    AT END OF row.
      gs_t_plan-catal = '계획'.
      gs_t_plan-waers = 'USD'.
      APPEND gs_t_plan TO gt_t_plan.
      CLEAR: gs_t_plan.
    ENDAT.

*   Unassign Field symbol
    UNASSIGN <fs_val>.
    CLEAR: lv_kostl, lv_kstar, ls_intern.
  ENDLOOP.

ENDFORM.