SAP/ABAP
[ABAP] FIELD-SYMBOL 필드 심볼
jipgagosipda
2024. 8. 5. 13:37
<개념>
동적으로 데이터 처리를 할 수 있는 구문
<사용목적>
조건 경우의 수가 많을 때 필드 심볼 로직을 통해 동적으로 처리할 수 있다.
--> 다양한 조건을 한 로직을 통해 받을 수 있기 때문에 편리함
<구문 예시>
CASE: FAGLFLEXT 테이블(계정 잔액 테이블)의 잔액 필드에 2000씩 더하자
TSL01 ~ TSL16까지 +2000
필드 수가 많기 때문에 필드 심볼을 사용해서 동적으로 처리해보자
TSLXX처럼 필드 이름에 규칙이 있는 경우에 필드 심볼을 사용할 수 있다.
방법 1
DATA : lt_data TYPE TABLE OF faglflext,
ls_data LIKE LINE OF lt_data,
lv_field TYPE fieldname, "필드 이름 만들 변수
lv_mon(2) TYPE n. "01 형식으로 나오도록.
FIELD-SYMBOLS : <lfs_field> TYPE any. "어떤 타입이든 될 수 있다.
"2013년 잔액 데이터 SELECT
SELECT *
INTO CORRESPONDING FIELDS OF TABLE lt_data
FROM faglflext
WHERE ryear = '2013'.
DO 16 TIMES. "16기간이기 때문에
lv_mon = sy-index. "do문에서는 index. 이 변수가 '월'이 됨.
CONCATENATE 'ls_data-TLS' lv_mon INTO lv_field. "ls_data-TSLXX 형식을 만들어서 lv_field에 넣기
CONDENSE lv_field NO-GAPS. "공백제거
ASSIGN (lv_field) TO <lfs_field>. "lv_field를 field symbol에 할당
"ls_data-tsl01이 됨
"lv_field에 완전한 변수명이 들어있어야 함.
"ASSIGN 뒤에는 온전한 변수명이 온다.
IF <lfs_field> IS ASSIGNED. "ASSIGNED 되었다면
<lfs_field> = <lfs_field> + 2000. "lv_field(ls_data-TSLXX)에 2000씩을 더함.
ENDIF.
ENDDO.
방법 2
ASSIGN COMPONENT OF STRUCTURE: 특정 스트럭쳐에 있는 필드만 찾는다.
DATA : lt_data TYPE TABLE OF faglflext,
ls_data LIKE LINE OF lt_data,
lv_field TYPE fieldname, "필드 이름 만들 변수
lv_mon(2) TYPE n. "01 형식으로 나오도록.
FIELD-SYMBOLS : <lfs_field> TYPE any. "어떤 타입이든 될 수 있다.
"2013년 잔액 데이터 SELECT
SELECT *
INTO CORRESPONDING FIELDS OF TABLE lt_data
FROM faglflext
WHERE ryear = '2013'.
DO 16 TIMES. "16기간이기 때문에
CLEAR lv_field.
UNASSIGN <lfs_field>. "할당 취소
lv_mon = sy-index. "do문에서는 index. 이 변수가 '월'이 됨.
CONCATENATE 'TLS' lv_mon INTO lv_field. "ls_data-TSLXX 형식을 만들어서 lv_field에 넣기
CONDENSE lv_field NO-GAPS. "공백제거
"필드를 뽑아와서 할당
ASSIGN COMPONENT lv_field OF STRUCTURE ls_data to <lfs_field>. "ls_data의 필드명이 lv_field인 것 <lfs_field>에 할당
IF <lfs_field> IS ASSIGNED. "ASSIGNED 되었다면
<lfs_field> = <lfs_field> + 2000. "lv_field(ls_data-TSLXX)에 2000씩을 더함.
ENDIF.
ENDDO.