1과 2를 구조체를 비교할 때 사용해보자..
TYPES : ty_s_scarr TYPE scarr.
TYPES : BEGIN OF ty_s_error,
fname TYPE fieldname,
fdesc TYPE fieldname,
org_value(30),
cmp_value(30),
END OF ty_s_error.
DATA : ls_org TYPE ty_s_scarr, " 원본.
ls_cmp TYPE ty_s_scarr, " 비교.
lt_err TYPE TABLE OF ty_s_error. " 에러.
ls_org = VALUE #( carrid = 'AA' carrname = '에스파' currcode = 'USD' ).
ls_cmp = VALUE #( carrid = 'AB' carrname = '아이브' currcode = 'USD' ).
" 2개의 비교군이 있을 때 어떤 필드 값이 다를까?
" Get type.
DATA : lo_stdesc TYPE REF TO cl_abap_structdescr,
lo_datadesc TYPE REF TO cl_abap_datadescr.
" 최상위 CL_ABAP_TYPEDESCR에서 구조체 정보를 가져와서 downcasting.
lo_stdesc ?= cl_abap_typedescr=>describe_by_data( ls_org ).
" Fieldname이 담긴 Method 활용.
DATA(lt_component) = lo_stdesc->get_components( ).
LOOP AT lt_component INTO DATA(ls_component).
CASE TYPE OF ls_component-type.
WHEN TYPE cl_abap_elemdescr INTO DATA(lo_e).
" --* GET FIELD DESC.
DATA(ls_elem) = lo_e->get_ddic_field( sy-langu ).
ENDCASE.
"--* Assign Field Value.
ASSIGN COMPONENT : ls_component-name OF STRUCTURE ls_org TO FIELD-SYMBOL(<fv_org_val>),
ls_component-name OF STRUCTURE ls_cmp TO FIELD-SYMBOL(<fv_cmp_val>).
CHECK <fv_org_val> IS ASSIGNED AND <fv_cmp_val> IS ASSIGNED.
"--* Field Value Check.
IF <fv_org_val> NE <fv_cmp_val>.
"--* Get Field Name Desc.
DATA(lv_fname) = ls_elem-reptext.
APPEND VALUE #( fname = ls_component-name " Field Name.
fdesc = lv_fname " Field Desc.
org_value = <fv_org_val> " Org Value.
cmp_value = <fv_cmp_val> " Cmp Value.
) TO lt_err.
ENDIF.
ENDLOOP.
LT_COMPONENT 정보
-> 선언한 필드 네임과 타입 정보가 들어있다.
타입 정보
-> D.E 정보가 들어있다..
결과
-> 원본값과 비교해서 다른 값을 담아봤다.
원본과 비교해서 데이터를 찾고자할 때 사용..
끝.