[SAP] FIELD-SYMBOLS 사용방법 (ASSIGN, ASSIGN COMPONENT)

2022. 9. 18. 16:31SAP - 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 사용 방법입니다 :)