동적 개발 중 기초라 할 수 있는 table 이름을 입력받아 Grid를 만들어 띄우는 동적 그리드 개발을 해보아요.
CBO 테이블 유지보수 할 때 한 프로그램 내에서 여러 테이블을 관리하고자 할 때 응용하면 좋겠죠
Runtime Type Service
런타임 시 Data Object의 유형 정보를 결정하고 새 데이터 유형을 정의할 수 있습니다.
간단 요약
- CL_ABAP_TYPEDESCR 최상위
1번은 상속받아서 사용되는 메소드
2번은 본인 클래스에서 사용하는 메소드
더 심화 개념은 다른 블로그 참고..
구구절절 PBO 생략하겠음..
FORM set_key_param .
DATA : lo_ref TYPE REF TO data.
DATA : lt_cell TYPE lvc_t_styl.
FIELD-SYMBOLS : <fs_data>,
<ft_data> TYPE STANDARD TABLE.
DATA(ls_struct) = CAST cl_abap_structdescr(
cl_abap_typedescr=>describe_by_name( p_tab ) ). " 파라미터 - 입력받은 테이블 이름
DATA(lt_comp) = ls_struct->get_components( ).
" - The statement CREATE DATA uses the addition HANDLE to create a data object whose data type is
" - described by an RTTS type description object.
CREATE DATA lo_ref TYPE HANDLE ls_struct.
ASSIGN lo_ref->* TO <fs_data>.
FREE lo_ref.
CREATE DATA lo_ref LIKE STANDARD TABLE OF <fs_data>.
ASSIGN lo_ref->* TO <ft_data>.
FREE lo_ref.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE <ft_data>
FROM (pv_tabnm)
WHERE (pt_where).
ENDFORM.
1.한 단계씩 설명해봄
DATA(ls_struct) = CAST cl_abap_structdescr(
cl_abap_typedescr=>describe_by_name( p_tab ) ).
-> describe_by_data
는 cl_abap_typedescr의 메소드이며, 매개변수로 type any를 받아 type ref to 로 CL_ABAP_TYPEDESCR
형식의 무언가를 반환한다.
-> 뭘 반환하는데? f1을 가보자
Gets a type description object of the type whose absolute or relative type name was passed.
넘겨받은 type description을 뱉는다고 하네요..
근데 왜 cast를 사용해서 cl_abap_structdescr
을 받을까요?
-> get_components( )
메소드를 사용하기 위함임니다. 메소드는 cl_abap_structdescr 요놈이 가지고 있기 때문이죠..
->get_components( )
요놈은 F1 확인하시면
gets the component description table of the structure.
이렇다고 함니다..
그럼 디버깅으로 DATA(lt_comp)가 뭘 가지고 있는지 확인해보면 ~
-> SCARR의 필드명을 가지고 있네요.
여기 코드에서는 LT_COMP가 사용되지 않지만, Edit이나 무언갈 제어하고자 할 때 CREATE_DYNAMIC_TABLE
메소드를 사용할 때 사용 될 수 있습니다. 메소드 활용 이해를 위해 껴놓은 코드임
type ref to data
형식의 변수임니다.CREATE DATA lo_ref TYPE HANDLE ls_struct.
ASSIGN lo_ref->* TO <fs_data>.
FREE lo_ref.
CREATE DATA lo_ref LIKE STANDARD TABLE OF <fs_data>.
ASSIGN lo_ref->* TO <ft_data>.
FREE lo_ref.
-> type handle
은 RTTS 형식으로 얻은 데이터 오브젝트를 구체화할 때 사용된다고 함.
lo_ref를 앞선 코드로 구체화한 ls_struct 형식을 넘겨서, 이를 필드심볼(type any)에 넘겨준다. 이때 SCARR의 Structure 형식의 필드심볼이 생성됨.
-> 데이터는 필드심볼 type any로 받을 수 없으므로, lo_ref를 다시 한 번 더 필드심볼의 테이블 형태로 만들어 할당한다. 그럼 SCARR의 형식을 가진 필드심볼의 ITAB이 생성된다.
여기까지 디버깅을 확인해보면?
- <fs_data>
- <ft_data>
셀렉문을 지나면
NAMETAB_GET
사용SE37에서 해당 펑션 돌려보삼
테이블 정보 다 가져옴니다.
이제 어찌저찌 루프 돌면서 FCAT 넘기고 APPEND 알죠?
TRY .
SELECT MIN( ddtext )
INTO @DATA(lv_text)
FROM dd02t
WHERE tabname EQ @p_tab
AND ddlanguage EQ @sy-langu
AND as4local EQ 'A'.
CATCH cx_sy_itab_line_not_found.
ENDTRY.
감사합니다.
후속편은 동적으로 필드심볼 형태의 itab을 SORT하는 방법..을 메모함니다. 그렇다고 너무 동적은 아님.
빨리올려주세요 현기증나요 -.- ;;