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 파일 경로 알아보기
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_GJ는 SFLIGHT 구조이다.
3. 우선 기본 세팅?이라고 해야 하나 TYPE에 따라서 하기 전에 기본 LOOP문이라고 보면 된다.
#1. 설명은 LT_ALSMEX에 있는 값을 GT_EXCEL에 넣어줘야 때문에 LOOP문을 돌려줘야 한다.
#2. ASSIGN COMPONENT을 통해서 COL값에 따라 GS_EXCEL에 값을 동적으로 넣어주기 위한 전 단계
#3. 성공하면 <FS_FIELD>인 곧 GS_EXCEL-( )에 값이 동적으로 들어간다.
#4. 위에서 설명했듯이 14번째가 끝나고 다시 1번째로 넘어가기 전에 GT_EXCEL에 값을 APPEND 해준다.
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 사용 시 )
'.ABAP > ..Excel, EMail' 카테고리의 다른 글
SAP AbapGit 설치 (1) | 2024.09.03 |
---|---|
SAP Excel Upload( Web GUI ) 정리 (4) | 2024.08.13 |
SAP OLE Excel 정리 (12) | 2023.07.10 |
SAP Web Repository( 웹 저장소 ) 정리( 로직, 저장, 덮어쓰기 ) (0) | 2023.04.23 |
SAP E-Mail(이메일) 발송 (0) | 2023.04.14 |