ABAP

[ABAP] Field-Symbol을 사용해 동적으로 구성하기

mrexuex 2023. 4. 6. 14:55

 

: 왼쪽 내역필드에 Domain Fiexed Value를 가져와서 넣어야 하는데 한식, 중식, 일식, 후식 필드가 다 똑같은 상황. 인터널 테이블만 다른 똑같은 Loop를 4번 돌리기 싫어서 동적으로 구성하면 좋겠다고 생각함. DD07T 테이블이랑 Join을 걸어도 되지만 연습삼아 해도 좋은듯

TYPES : BEGIN OF LTY_TABNAME,
          TABNAME TYPE STRING,     "인터널 테이블명
        END OF LTY_TABNAME.

DATA : LT_TABNAME TYPE TABLE OF LTY_TABNAME.

DATA : LS_DFIES   TYPE DFIES,           "도메인 속성
       LT_VALUES  TYPE DDFIXVALUES.     "Fixed Value

DATA : LO_ELEM    TYPE REF TO CL_ABAP_ELEMDESCR.    "단일 변수 담당

FIELD-SYMBOLS : <FT_TAB> TYPE ANY TABLE,
                <FS_GUBUN>,
                <FS_GUBUN_TX>.



*->Main Data Select
SELECT *
  FROM ZCMT010
  INTO CORRESPONDING FIELDS OF TABLE @GT_TAB1.     "한식



SELECT *
  FROM ZCMT011
  INTO CORRESPONDING FIELDS OF TABLE @GT_TAB2.     "중식



SELECT *
  FROM ZCMT012
  INTO CORRESPONDING FIELDS OF TABLE @GT_TAB3.     "일식



SELECT *
  FROM ZCMT013
  INTO CORRESPONDING FIELDS OF TABLE @GT_TAB4.     "후식

 

*->Domain Fixed Value값 가져오기
LO_ELEM ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_NAME('ZGUBUN_20806').    "정보를 알고 싶은 데이터 엘리먼트
LS_DFIES = LO_ELEM->GET_DDIC_FIELD( ).                             "해당 데이터 엘리먼트의 자세한 정보
LT_VALUES = LO_ELEM->GET_DDIC_FIXED_VALUES( ).                     "Domain Fixed Value 정보



*->Loop 대상 인터널 테이블명
LT_TABNAME = VALUE #( ( TABNAME = 'GT_TAB1' )
                      ( TABNAME = 'GT_TAB2' )
                      ( TABNAME = 'GT_TAB3' )
                      ( TABNAME = 'GT_TAB4' ) ).



*->동적 인터널 테이블 구성
LOOP AT LT_TABNAME INTO DATA(LS_TABNAME).
   ASSIGN (LS_TABNAME-TABNAME) TO <FS_TAB>.     "<FS_TAB>에 각 인터널 테이블 데이터가 들어오게 됨

" <FS_TAB> 자체가 동적으로 구성되기 때문에 스트럭처도 동적으로 선언해줘야함
     LOOP AT <FS_TAB> ASSIGNING FIELD-SYMBOL(<FS_STR>). 
          "주의할 점 : 모든 인터널 테이블에 GUBUN이라는 필드를 공통적으로 가지고 있어야 덤프가 안남
          ASSIGN COMPONENT 'GUBUN' OF STRUCTURE <FS_STR> TO <FS_GUBUN>.
          CHECK <FS_GUBUN> IS ASSIGNED.
          READ TABLE LT_VALUES INTO DATA(LS_VALUES) WITH KEY LOW = <FS_GUBUN>.


          "스트럭처가 동적이라 <FS_STR>-GUBUN_TX = LS_VALUES-DDTEXT 구문은 에러가 남(한개로 특정되지가 않아서)
          ASSIGN COMPONENT 'GUBUN_TX' OF STRUCTURE <FS_STR> TO <FS_GUBUN_TX>.
          <FS_GUBUN_TX> = LS_VALUES-DDTEXT.
     ENDLOOP.

ENDLOOP.
반응형