[ABAP] 동적 그리드 개발

Jubami·2023년 11월 2일
0

SAP 

목록 보기
9/13

동적 개발 중 기초라 할 수 있는 table 이름을 입력받아 Grid를 만들어 띄우는 동적 그리드 개발을 해보아요.

CBO 테이블 유지보수 할 때 한 프로그램 내에서 여러 테이블을 관리하고자 할 때 응용하면 좋겠죠

  • 서버 : HANA

알고가자 개념

Runtime Type Service
런타임 시 Data Object의 유형 정보를 결정하고 새 데이터 유형을 정의할 수 있습니다.

  • 간단 요약
    - CL_ABAP_TYPEDESCR 최상위

    • 하위에 DATA,OBJ
    • DATA 하위에 주로 사용되는 STRUCTDESCR,TABLEDESCR이 있음.
    • 각각 클래스에서 반환하는 타입이 다르기때문에 RTTS 사용 시 CAST와 Down Casting을 잘 이해하고 사용해야 한다.
  • 1번은 상속받아서 사용되는 메소드

  • 2번은 본인 클래스에서 사용하는 메소드

  • 더 심화 개념은 다른 블로그 참고..

미리보기 - 검색

미리보기 - 결과

  • SCARR Table의 Description을 alv header에 띄우고
  • 해당 table의 key 정보를 받아 alv에 표시해보자

구구절절 PBO 생략하겠음..

PARAMETER 값을 통해 ITAB을 동적으로 받아보자

  • 한 줄 씩 설명은 아래서.
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 메소드를 사용할 때 사용 될 수 있습니다. 메소드 활용 이해를 위해 껴놓은 코드임

  1. 할당
  • 앞서 코드를 보면 lo_Ref는 type ref to data 형식의 변수임니다.
    이는 Generic Type인 DATA로 정의된 것이며, 어떠한 Data Object를 바라볼 수 있습니다.
    -> 어떠한 데이터 오브젝트가 올 지 모르니 Generic type으로 선언하고, 구체화하는 과정이라 생각하면 된다.
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>

  • 셀렉문을 지나면

Fieldcatalog 구성

  • 제일 간단한 방법
    - Function NAMETAB_GET 사용
    • SE37에서 해당 펑션 돌려보삼

    • 테이블 정보 다 가져옴니다.

이제 어찌저찌 루프 돌면서 FCAT 넘기고 APPEND 알죠?

ALV Header에 Table Description 표시하기

  • 헤더 그리는 방법 그런거 다 생략함니다.
  • dd02t 테이블 select하면 나옴니당
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하는 방법..을 메모함니다. 그렇다고 너무 동적은 아님.

profile
LV.1 아밥퍼

2개의 댓글

comment-user-thumbnail
2023년 11월 6일

빨리올려주세요 현기증나요 -.- ;;

1개의 답글