SAP/ABAP

[ABAP] FIELD-SYMBOL 필드 심볼

jipgagosipda 2024. 8. 5. 13:37

<개념>

동적으로 데이터 처리를 할 수 있는 구문

 

 

<사용목적>

조건 경우의 수가 많을 때 필드 심볼 로직을 통해 동적으로 처리할 수 있다.

--> 다양한 조건을 한 로직을 통해 받을 수 있기 때문에 편리함

 


<구문 예시>

CASE: FAGLFLEXT 테이블(계정 잔액 테이블)의 잔액 필드에 2000씩 더하자

TSL01 ~ TSL16까지 +2000

필드 수가 많기 때문에 필드 심볼을 사용해서 동적으로 처리해보자

FAGLFLEXT 계정 잔액

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.