300x250

Excel Upload란


말 그대로 Excel 파일CBO 테이블이나 Standard 프로그램업로드, 조회하기 위해서 필요한 업로드 기능이다

이번 블로그에서 볼 것은 Excel 파일 ALV( Internal Table ) 옮기는 작업을 알아볼 것이다. 

 

또한 엑셀을 업로드할 때에는 엑셀 양식이 있기 때문에 당연히 타입필드는 알고 있을 것이다. 

 

그러면 시작해 보자.

 

샘플( Excel 파일에 있는 필드에 따라서 설정해주면 된다)


TOP

# MANDT를 넣어줘야 한다.

그 이유는 엑셀 -> 인터널 테이블을 넣을 때 순서가 밀리기 때문에 넣어주는 게 좋다. 

 

Excel Data( SFLIGHT Table ) 

 

 

#1. 우선 Excel File을 지정해 줄 파라미터이벤트를 설정해 보자.


1. 밑에 사진처럼 나오게 하는 것은 생략하겠다. 궁금하다면 밑에 블로그를 확인하자.

 

2023.07.10 - [.SAP/..ABAP] - SAP 파일 선택 or 파일 경로 알아보기

 

SAP 파일 선택 or 파일 경로 알아보기

... 프로그램을 만들면서 Excel 업로드 or Excel 다운로드 등등 컴퓨터 파일에 저장을 하는 경우도 있을 테고, 컴퓨터 파일을 선택할 때가 있을 것이다. 거기서 필요한 것을 알아볼 것이다. 알아보기

potato98.tistory.com

 


START-OF- SELECTION 설정

 

#2. 앞에서 받아온 엑셀 파일을 인터널 테이블에 옮기는 작업 해 보자.


# CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'을 사용해서 인터널 테이블에 값을 옮겨보자. 

  DATA: LT_ALSMEX TYPE TABLE OF ALSMEX_TABLINE.


  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      FILENAME                = PA_FILE  " 받아온 파일 " 
      I_BEGIN_COL             = 1        " 시작 할 열번호 "
      I_BEGIN_ROW             = 2        " 시작 할 행번호 "
      I_END_COL               = 256      " 명시한 필드갯수 "
      I_END_ROW               = 100000   " 최대 행갯수 "
    TABLES
      INTERN                  = LT_ALSMEX " 해당 테이블에 값 넣기. " 
    EXCEPTIONS
      INCONSISTENT_PARAMETERS = 1
      UPLOAD_OLE              = 2
      OTHERS                  = 3.

 

중요!

3. 위에서 가져온 "LT_ALSMEX"을 인터널테이블(ALV)옮겨야 하는데 과정이다. 여기서 아밥 타입으로 변경해줘야 하기 때문에 중요한 부분이다.  


# 우리가 여기서 할 것은 정적이 아닌 동적으로 하려고 한다. 사실 정적으로 한다는 것은 너무나 노가다성이 되기 때문에 오히려 더 어려운 것 같다...  동적 하기 위해서 Field-Symbols을 사용해 보자.

- Field-Symbol에 대해서는 나중에 정리하겠다..ㅎ

 

1. 우선 "LT_ALSMEX"에 대한 디버깅을 해봐야 한다.  

# 디버깅에서 빨간 상자를 보게 되면 Excel 하나의 데이터14개로 나누어져 있는 걸 볼 수 있다.

또한 VALUE 값을 보면 ( 잘 기억하고 있자 )

" - "

" , "

" . "

...

이러한 콤마 이런 게 들어가 있는 걸 볼 수 있다. 이것들을 잘 처리를 해줘야 덤프가 안 나고 에러발생이 안된다. 또한 저런 Value 말고도 많은데 그거는 상황에 맞게 처리해 주면 된다. 

 

2. Value 값에 맞게 또는 TYPE에 맞게 분류하는 방법여러 가지이다.

여기서 할 것은 TYPE에 맞게 VALUE 값정제할 것이다. 우선 스트럭처의 타입들 정보를 가져와보자.

# CALL FUNCTION 'DDIF_FIELDINFO_GET'을 통해서 필드에 대한 모든 정보들을 가져올 수 있다.

혹여나 ZSFLIGHT_GJSFLIGHT 구조이다.

 

3. 우선 기본 세팅?이라고 해야 하나 TYPE에 따라서 하기 전에 기본 LOOP문이라고 보면 된다. 

#1. 설명은 LT_ALSMEX에 있는 GT_EXCEL에 넣어줘야 때문에 LOOP문을 돌려줘야 한다. 

#2. ASSIGN COMPONENT을 통해서 COL값에 따라 GS_EXCEL에 값을 동적으로 넣어주기 위한 전 단계

#3. 성공하면 <FS_FIELD>인 곧 GS_EXCEL-(      )에 값이 동적으로 들어간다.

#4. 위에서 설명했듯이 14번째가 끝나고 다시 1번째넘어가기 전에 GT_EXCELAPPEND 해준다.

 

  LOOP AT LT_ALSMEX INTO DATA(LS_ALSMEX).

    ASSIGN COMPONENT LS_ALSMEX-COL OF STRUCTURE GS_EXCEL TO FIELD-SYMBOL(<FS_FIELD>).

    IF SY-SUBRC EQ 0.
      <FS_FIELD> = LS_ALSMEX-VALUE.
    ENDIF.


    AT END OF ROW.
      APPEND GS_EXCEL TO GT_EXCEL.
    ENDAT.


  ENDLOOP.

 

여기까지의 큰 로직을 보면 다음과 같다.

 

지금 실행을 하면 당연히 덤프가 뜰 것이다. 이제 덤프가 안 뜨게 변경해 보자.

 

타입에 따라서 변경을 안 해주면

OverWrite라고 덤프가 뜰 것이다.

또한 자릿수가 안 맞거나 타입Conversion이 안 됐다거나.. 등등.. 

실행해 보면 될 것이다.

 

4. TYPE 경우에 따라서 분류 and Conversion Exit가 있으면 INPUT처리를 할 것이다. 먼저 TYPE 경우부터 시작해 보자.


1. "LT_DFIES"을  READ TABLE문 통해서 해당 필드 TYPE에 대한 정보를 가져올 것이다. 

 

2. CASE문을 통해서 TYPE에 따라서 분류를 해주고, REPLACE문을 통해서 대체해 주자.

# REPLACE ALL OCCURRENCES OF A IN B WITH C.

B 안에 있는 A C로 다 대체한다.

ex) 2023-07-25 => 20230725

 

REPLACE문은 주로 날짜, 금액, " - " 등 들어가는 데이터가 있을 때 사용해서 덤프를 막아준다.

 

또한 다른 타입분류해서 정제를 하고 싶으면 WHEN문추가해서 정제하면 된다.

 

3. Conversion 할 필드가 있으면 경우에 따라서 동적으로 처리를 하겠다.

Conversion을 사용해서 자릿수에 따라서  "0"을 붙히거나 없애거나 둘 중 선택해서 쓰인다.

예를 들면  Function Module, BAPI를 사용 할 때 자릿수에 맞춰서 보내줘야 할 때 많이 쓰이기도 한다.  

 

# LS_DFIES-CONVEXIT가 있으면 _INPUT을 타게 하는 로직이다.

예를 들어서 필드 중에 BANFN( 구매 요청 번호 )가 있다고 가정해 보면 Routine : ALPHA 가 자동으로 들어간다고 생각하면 된다. 

로직을 타게 되면 이런 식으로 되는 것이다. 하나하나 쓰기에는 너무 많기 때문에 동적으로 사용한 것이다. 

로직

 IF SY-SUBRC EQ 0.
      CASE LS_DFIES-INTTYPE.
        WHEN 'P'.
          REPLACE ALL OCCURRENCES OF ',' IN LS_ALSMEX-VALUE WITH SPACE.
        WHEN 'D'.
          REPLACE ALL OCCURRENCES OF '-' IN LS_ALSMEX-VALUE WITH SPACE.
        WHEN OTHERS.

      ENDCASE.

      IF LS_DFIES-CONVEXIT IS NOT INITIAL.
        DATA(FUNCTION_NAME) = 'CONVERSION_EXIT_' && LS_DFIES-CONVEXIT && '_INPUT'.

        CALL FUNCTION FUNCTION_NAME
          EXPORTING
            INPUT  = LS_ALSMEX-VALUE
          IMPORTING
            OUTPUT = LS_ALSMEX-VALUE.

      ENDIF.


      <FS_FIELD> = LS_ALSMEX-VALUE.
    ENDIF.

 

실행화면

 

끝...

이렇게 하면 Excel Upload는 완성이다. 처음에는 정말 많은 오류가 나오는데 다행히 Field-Symbol 때문에 로직이 많이 줄어들었다..

 

Web GUI에서는 해당 Function Module이 안되기 때문에 다음 링크에서 확인해보자.

2024.08.13 - [.SAP/..ABAP] - SAP Excel Upload( Web GUI 사용 시 )

 

SAP Excel Upload( Web GUI 사용 시 )

# Web GUI 말고 GUI 2023.07.25 - [.SAP/..ABAP] - SAP Excel Upload 정리 SAP Excel Upload 정리Excel Upload란말 그대로 Excel 파일을 CBO 테이블이나 Standard 프로그램에 업로드, 조회하기 위해서 필요한 업로드 기능이다

potato98.tistory.com

 

 

 

도움이 되셨으면 하단에 있는 광고 한번씩 눌러주세유!!

728x90