본문 바로가기

SAP/ABAP

[엑셀 업로드 프로그램 이해하기]PERFORM UPLOAD_FROM_EXCEL 디버깅(1/2)

최초 작성일: 2024-08-18

최종 작성일: 2024-08-18

목표: 엑셀업로드프로그램 이해하기  

 

#1. CALL FUNCTION GUI_UPLOAD 디버깅

 

FORM upload_from_excel .
  DATA : lv_filename      TYPE string,
         lt_records       TYPE solix_tab,
         lv_headerxstring TYPE xstring,
         lv_filelength    TYPE i.

  lv_filename = p_file.



  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                = lv_filename
      filetype                = 'BIN'
    IMPORTING
      filelength              = lv_filelength
      header                  = lv_headerxstring
    TABLES
      data_tab                = lt_records
    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
      OTHERS                  = 17.

  "convert binary data to xstring
  "if you are using cl_fdt_xl_spreadsheet in odata then skips this step
  "as excel file will already be in xstring
  CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
    EXPORTING
      input_length = lv_filelength
    IMPORTING
      buffer       = lv_headerxstring
    TABLES
      binary_tab   = lt_records
    EXCEPTIONS
      failed       = 1
      OTHERS       = 2.

  IF sy-subrc <> 0.
    "Implement suitable error handling here
  ENDIF.

  DATA : lo_excel_ref TYPE REF TO cl_fdt_xl_spreadsheet .

  TRY .
      lo_excel_ref = NEW cl_fdt_xl_spreadsheet(
                              document_name = lv_filename
                              xdocument     = lv_headerxstring ) .
    CATCH cx_fdt_excel_core.
      "Implement suitable error handling here
  ENDTRY .

  "Get List of Worksheets
  lo_excel_ref->if_fdt_doc_spreadsheet~get_worksheet_names(
    IMPORTING
      worksheet_names = DATA(lt_worksheets) ).

  IF NOT lt_worksheets IS INITIAL.
    READ TABLE lt_worksheets INTO DATA(lv_woksheetname) INDEX 1.

    DATA(lo_data_ref) = lo_excel_ref->if_fdt_doc_spreadsheet~get_itab_from_worksheet(
                                             lv_woksheetname ).
    "now you have excel work sheet data in dyanmic internal table
    ASSIGN lo_data_ref->* TO <gt_data>.
  ENDIF.          .

  DATA : lv_numberofcolumns   TYPE i,
         lv_date_string       TYPE string,
         lv_target_date_field TYPE datum.


  FIELD-SYMBOLS : <ls_data>  TYPE any,
                  <lv_field> TYPE any.

  "you could find out number of columns dynamically from table <gt_data>
  lv_numberofcolumns = 5 .

  LOOP AT <gt_data> ASSIGNING <ls_data> FROM 2 .


*    "processing columns
    DO lv_numberofcolumns TIMES.
      ASSIGN COMPONENT sy-index OF STRUCTURE <ls_data> TO <lv_field> .
      IF sy-subrc = 0 .
        CASE sy-index .
          when 1 .
            gs_EXCEL-MANDT = <lv_field>.
          when 2 .
            gs_EXCEL-CARRID = <lv_field>.
          when 3 .
            gs_EXCEL-CARRNAME = <lv_field>.
          when 4 .
            gs_EXCEL-CURRCODE = <lv_field>.
          when 5 .
            gs_EXCEL-URL = <lv_field>.

*          WHEN 10 .
*            lv_date_string = <lv_field> .
*            PERFORM date_convert USING lv_date_string CHANGING lv_target_date_field .
*            WRITE lv_target_date_field .
          WHEN OTHERS.
*            WRITE : <lv_field> .
        ENDCASE .

      ENDIF.
    ENDDO .
    APPEND gs_EXCEL TO gt_EXCEL.
    CLEAR gs_EXCEL.
*    NEW-LINE .
  ENDLOOP .

** TAB으로 구분된 내용을 잘라서 ITAB에 APPEND 한다.
*  LOOP AT lt_intern.
*    SPLIT lt_intern
*    AT cl_abap_char_utilities=>horizontal_tab
*    INTO gs_EXCEL-CARRID gs_EXCEL-CARRNAME gs_EXCEL-CURRCODE gs_EXCEL-URL.
*    gs_EXCEL-MANDT = '001'.
*    APPEND gs_EXCEL TO gt_EXCEL.
*    CLEAR gs_EXCEL.
*  ENDLOOP.
*
**HEADER LINE 삭제
*  IF gt_excel IS NOT INITIAL.
*    DELETE gt_excel INDEX 1. "상단에 적힌 필드명을 삭제시켜줌
*  ELSE.
*    MESSAGE '데이터가 존재하지 않습니다' TYPE 'E'.
*  ENDIF.

ENDFORM.

 

1-1 디버깅 

EXPORTING

Function으로 값을 보낸다

  • lv_filename : 파일업로드 경로
  • filetype: 업로드한 파일 타입

 

IMPORTING

Function에서 값을 구해 넣는다

    • lv_filelength : 업로드 파일 문자 길이=4465 
    • lv_headerxstring : 업로드한 파일을 숫자 형태로 전환(숫자로 전환하는 사유는 해당 function에서 파일에 대해 숫자 값을 입력해야 작동 가능함) -> 이펑션에서는 빈값이 됨.

 

TABLE

Function에 값을 넣거나 값을 보낼 수있음 ( 현재 해당 테이블에 값이 없어 IMPORTING)    

  • it_record : 숫자, 영어로 구성된암호화 된 데이터 18행 값  

#2. CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' 디버깅

파일 길이와 바이너리 타입으로 암호돠된 업로드 데이터를가져다가 한 줄로 합쳐서 

lv_headerxsting에 값을 넣는 함수  

 

코드

  CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
    EXPORTING
      input_length = lv_filelength
    IMPORTING
      buffer       = lv_headerxstring
    TABLES
      binary_tab   = lt_records
    EXCEPTIONS
      failed       = 1
      OTHERS       = 2.

  IF sy-subrc <> 0.
    "Implement suitable error handling here
  ENDIF.

 

EXPORTING

Function으로 값을 보낸다   

  • input_length = lv_fieldlength = 업로드한 파일 문자길이 =4465  

TABLES

Function에 값을 넣거나 값을 내보낼 수 있음 ( 이경우에는 It_records에 값이 있으므로 내보냄-exporting)

    • binary_tab   lt_record (숫자로 암호화한데이터를 한행으로 만든 것을 18행으로 나누어서 만든 테이블) 

IMPORTING

Function에서 값을 구해 넣는다. 

  • lv_headerxstring : 한 줄 긴 문자열이 들어가며, IT_RECORD 테이블에 있던 여러 열의 값이 한 행으로 만들어짐 
    (각 열로 나눠진 값을 한 행으로 만드는 이유는 관련 펑션 실행을 위해서임)