2022. 9. 18. 16:31ㆍSAP - ABAP
상황에 따라 데이터 추출 대상 필드가 바뀌는 프로그램을 개발할 상황이 생겼다.
(특이케이스 그만 좀 만들어라...凸( •̀_•́ )凸)
여태까지는 TABLE에 담아놓은 데이터를 활용할 때 필드가 고정된 프로그램만 개발해왔기 때문에
크게 어려움 없이 개발해왔는데
이번엔 엑셀을 업로드해서 해당 데이터를 가공해야 하는데 케이스별로 엑셀 양식이 상이해서
조회조건에서 원하는 값이 들어 있는 열의 알파벳을 입력 받고
그 값 기준으로 데이터를 동적으로 추출하는 용도로 개발하려고 한다.
여기서 사용되는 것은
"FIELD-SYMBOL" 이라는 개념인데
ABAP 프로그램 내에서 데이터 구조에 동적인 접근이 가능하도록 하는 특성을 가지고 있다
FIELD-SYMBOLS 선언
우선 FIELD-SYMBOL은 <>를 사용해서
변수를 선언한다.
[예시1]
FIELD-SYMBOLS <fs>.
[예시2]
FIELD-SYMBOLS: <fs> TYPE ANY [TABLE].
[예시3]
FIELD-SYMBOLS: <fs> LIKE GT_DATA.
ASSIGN
그 다음 ASSIGN이라는 구문을 활용해
Field Symbol과 Structure 이름 연결이 가능하다.
말그대로 Field Symbol에 값을 할당하는 개념!
[예시]
ASSING LV_VALUE TO <fs>
나 같은 경우는 조회조건에서 추출 필요한 열을 알파벳으로 입력받은 뒤 그 필드를 찾아오는 식으로 개발했다.
이때 사용한 개념은
ASSIGN COMPONENT LV_FIELD OF STRUCTURE [TABLE] TO <fs> 이다.
LV_FIELD라는 변수 안에 들어갈 수 있는 값은 몇 번째 열인지를 따지는 '숫자'가 들어갈 수도 있고
필드명 자체가 들어갈 수도 있다.
[예시]
상황을 설정해보자면...
우선 엑셀 업로드를 통해 GT_UPLOAD라는 테이블에 값을 넣어두고 조회조건에서 알파벳만 입력 가능한 P_INPUT 필드를 만들었다. GT_UPLOAD에서 조회조건에 입력한 알파벳에 해당되는 필드를 추출해 GT_TEMP에 담아줄 예정이다.
물론 사전에 P_INPUT에 대해 알파벳만 들어 있는지 SY-ABCDE 를 이용해 체크하는 로직은 필수!
개발 소스는 아래와 같당.
DATA: LV_FIELD LIKE SY-INDEX,
LS_UPLOAD LIKE GT_UPLOAD.
"FIELD-SYMBOL 선언
FIELD-SYMBOLS: <LS_VALUE>.
"CASE문으로 EXCEL필드 열을 숫자화
CASE P_INPUT
WHEN 'A'
LV_FIELD = '1'.
WHEN 'B'
LV_FIELD = '2'.
.
.
.
WHEN 'Z'
LV_FIELD = '26'.
WHEN OTHERS.
CLEAR : LV_FIELD.
ENDCASE.
LOOP AT GT_UPLOAD.
"LS_UPLOAD에 현재 LOOP 돌고 있는 순서의 데이터 담기
MOVE-CORRESPONDING GT_UPLOAD TO LS_UPLOAD.
"LV_FIELD 번째 해당되는 데이터를 LS_UPLOAD에서 추출해 <LS_VALUE>에 담기
ASSIGN COMPONENT LV_FIELD OF STRUCTURE LS_UPLOAD TO <LS_VALUE>
"추출됐으면 0 아니면 4
IF SY-SUBRC IS NOT INITIAL.
EXIT.
ENDIF.
"추출된 <LS_VALUE>를 GT_TEMP-NUMBER에 담기
GT_TEMP-NUMBER = <LS_VALUE>.
APPEND GT_TEMP.
CLEAR : GT_TEMP.
ENDLOOP.
ASSIGN COMPONENT를 쓸때, 내가 30분 정도 헤맸던 부분이 있다.
아까 위해서 말했듯이
ASSIGN COMPONENT LV_FIELD OF STRUCTURE STRUCTURE TO <FS>
LV_FIELD를 열 번호 또는 STRUCTURE의 필드명을 둘 다 쓸 수 있다고 했는데
이때 LV_FIELD에 대한 데이터 속성값 선언을 잘 확인해야한다.
나는 CASE문을 통해 LV_FIELD를 열 번호로 지정해줬기 때문에
DATA : LV_FIELD LIKE SY-TABIX. 로 선언을 했어야 했는데
처음에 DATA : LV_FIELD TYPE STRING. 으로 지정을 해줬다.
그래서 계속 ASSIGN COMPONENT를 하는데 SY-SUBRC 가 4로 떨어져서
왜 값을 못가져오는지 한참을 헤맸었다.
타입이 다르면 데이터를 ASSIGN 하지 못한다는 사실!ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
혹시 SY-SUBRC가 4로 떨어진다면 이 부분을 의심해봐도 좋을 듯...?
이상 ASSIGN COMPONENT에서 한참을 헤맨 뒤
빡쳐서 쓰게된 Field-Symbol과 ASSIGN 사용 방법입니다 :)
'SAP - ABAP' 카테고리의 다른 글
[SAP/ABAP] 팝업창 상태에서 Debug 모드 (/h)로 전환하기 (0) | 2023.06.22 |
---|---|
[SAP] 클래스(class) - 특성(characteristics) 설정 방법(추가/연결/삭제) 및 데이터 select 방법 (3) | 2022.11.06 |
[ABAP] SAP 화면 SCREEN에서 EXIT-COMMAND 사용하기 (0) | 2022.10.12 |
[SAP] 검색이력(드롭다운리스트) 출력이 안될 때 조치 방법 (0) | 2022.09.18 |
[SAP] ALV 그리드 DUMP원인찾기 (GETWA_NOT_ASSIGNED) (0) | 2022.09.18 |