본문 바로가기
IT/SAP

[ABAP] Structure 구성 요소 가져오기(cl_abap_typedescr, cl_abap_structdescr)

by 109 2025. 5. 29.

ABAP에서 구조(structure)의 구성 요소를 동적으로 가져와야 하는 경우가 있습니다. cl_abap_typedescr와 cl_abap_structdescr 클래스를 사용하여 구조의 구성 요소를 가져오는 방법을 설명하겠습니다.

DATA: ls_sflight TYPE sflight.
DATA: lo_struct TYPE REF TO cl_abap_structdescr,
      lt_comp   TYPE abap_component_tab,
      ls_comp   TYPE abap_componentdescr.

lo_struct ?= cl_abap_typedescr=>DESCRIBE_BY_DATA( ls_sflight ).
lt_comp = lo_struct->GET_COMPONENTS( ).

LOOP AT lt_comp INTO ls_comp.
  WRITE: ls_comp-name.
ENDLOOP.

cl_abap_typedescr은 static 메소드라 =>로 호출합니다.
cl_abap_typedescr
componet 목록

 

예제) 같은 구조체 내에서 값이 달라진 구조체 명을 찾고 싶을 때.

FIELD-SYMBOLS: <fs1> TYPE ANY,
			   <fs2> TYPE ANY.

SELECT * INTO CORRESPONDING FIELDS OF ls_sflight FROM sflight
  UP TO 1 ROWS
  WHERE carrid EQ 'AA'.
ENDSELECT.

ls_sflight2 = ls_sflight.
ls_sflight2-carrid = 'LH'.
ls_sflight2-connid = '0400'.

LOOP AT lt_comp INTO ls_comp.
  CLEAR: lv_cond, lv_str, lv_str2.
  ASSIGN COMPONENT ls_comp-name OF STRUCTURE ls_sflight TO <fs1>.
  IF sy-subrc EQ 0 AND <fs1> IS ASSIGNED.
    ASSIGN COMPONENT ls_comp-name OF STRUCTURE ls_sflight2 TO <fs2>.
    IF sy-subrc EQ 0 AND <fs2> IS ASSIGNED.
      IF <fs1> <> <fs2>.
        lv_str = <fs1>.
        lv_str2 = <fs2>.
        CONCATENATE ls_comp-name lv_str lv_str2 INTO lv_cond SEPARATED BY space.
      ENDIF.
    ENDIF.
  ENDIF.
  WRITE: / lv_cond.
ENDLOOP.