본문 바로가기
ABAP

ALV Tree

by clode 2023. 2. 20.
728x90
반응형

Simple Tree를 사용하다 보니 항상 좌측에서 Simple Tree, 우측에는 상세내역 ALV를 가져다 사용해야 했다. 이걸 하나로 구성하기 위해 ALV를 Main으로 부가 Field 1개를 계층적으로 구성될 수 있도록 하는 ALV Tree를 사용한다.

ALV Tree는 ALV를 기준으로 추가기능적 요소가 결합된 형태로 구성되어 있다.

실습

항공사ID 단위로 트리를 구성하여 아래와 같이 보이도록 한다.

1. 데이터 선언

DATA: gt_tab  TYPE TABLE OF sflight,
      gs_tab  TYPE sflight.

DATA: g_alv_tree         TYPE REF TO cl_gui_alv_tree,
      g_custom_container TYPE REF TO cl_gui_custom_container.

이번 예제는 ALV 컨테이너를 따로 그리지 않고 트리에 데이터가 바로 나오게 하므로 트리 컨테이너만 선언한다. 선언 후 SCREEN 100번에 컨테이너를 그려준다.

SELECT-OPTIONS: s_carrid FOR gs_tab-carrid.  

초기 화면에 그려줄 항공사 코드를 범위값을 가진 필드로 그려준다.
프로그램이 CALL SCREEN 100을 만나면 화면100의 흐름로직을 탄다.


2. 트리 컨테이너 생성

  CHECK g_custom_container IS INITIAL.

  CREATE OBJECT g_custom_container
    EXPORTING
      container_name              = 'TREE1'.

컨테이너가 비어있을때만 생성한다.

3. 트리 컨트롤 생성

  CREATE OBJECT g_alv_tree
    EXPORTING
      parent              = g_custom_container
      node_selection_mode = cl_gui_column_tree=>node_sel_mode_single
      item_selection      = 'X'
      no_html_header      = 'X'
      no_toolbar          = ''.

4. 트리 헤더 생성

  DATA l_hierarchy_header TYPE treev_hhdr.

  PERFORM build_hierarchy_header CHANGING l_hierarchy_header.

FORM build_hierarchy_header CHANGING p_header TYPE treev_hhdr.
  " 헤더 구성
  p_header-heading = '항공편 번호'(300).
  p_header-tooltip = '항공편 번호(ALV)'(400).
  p_header-width = 40.
  p_header-width_pix = ' '.
ENDFORM.

5. 트리 컨트롤 화면 출력

  CALL METHOD g_alv_tree->set_table_for_first_display
    EXPORTING
      i_structure_name    = 'SFLIGHT'
      is_hierarchy_header = l_hierarchy_header
    CHANGING
      it_outtab           = gt_tab. "빈 인터널 테이블이어야함

이때 outtab에 사용하는 인터널테이블은 빈 인터널 테이블이어야한다. 그래서 select할때 이 인터널테이블을 참조하면서 데이터를 담을 인터널테이블을 이후 로컬로 따로 또 선언해준다.


6. 트리 노드 구성 ⭐⭐⭐

ALV TREE는 NODE KEY와 RELATE KEY만 잘 생각해주면 된다!!! 노드키와 관계 키만 구성을 잘하면 할줄 아는거다. 그래서 이부분이 제일 어려우면서 중요하다.

6-1. 트리 데이터 SELECT

트리에 데이터를 먼저 SELECT로 데이터를 가져와 인터널테이블에 담아준다.

  PERFORM create_hierarchy.

  FORM create_hierarchy .    

  "노드에 사용될 노드키와 관계키, 노드의 텍스트 변수
  DATA: l_rkey1 TYPE lvc_nkey,        
        l_nkey1 TYPE lvc_nkey,
        l_text1 TYPE lvc_value,
        l_rkey2 TYPE lvc_nkey,
        l_nkey2 TYPE lvc_nkey,
        l_text2 TYPE lvc_value,
        l_rkey3 TYPE lvc_nkey,
        l_nkey3 TYPE lvc_nkey,
        l_text3 TYPE lvc_value.

  DATA: lt_tab LIKE gt_tab,
        ls_tab LIKE gs_tab.

  SELECT * FROM sflight
    INTO TABLE lt_tab
   WHERE carrid IN s_carrid.

  SORT lt_tab BY carrid ASCENDING.

6-2. 트리 노드 구성 🌟

*최상위 노드
  l_rkey1 = ''.     "최상위는 연결된 키 없기때문에 빈값
  l_text1 = '항공사'.
  PERFORM add_node USING l_rkey1 l_text1 l_nkey1.    "ROOT 추가

*하위 노드
  LOOP AT lt_tab INTO ls_tab.
    AT NEW carrid.      "항공사 코드가 새로 시작될 때 수행
      l_rkey2 = l_nkey1.
      PERFORM get_carrname USING ls_tab-carrid l_text2.     "항공사 이름 가져오기
      PERFORM add_node USING l_rkey2 l_text2 l_nkey2.     "노드 추가
    ENDAT.

    l_rkey3 = l_nkey2.
    l_text3 = ls_tab-connid.
    PERFORM add_alv_node USING l_rkey3 l_text3 ls_tab l_nkey3.     "노드 추가
  ENDLOOP.
ENDFORM.

6-3. 항공사 이름 가져오는 FORM

FORM get_carrname  USING    p_carrid  p_text.
  SELECT SINGLE carrname FROM scarr
    INTO p_text
   WHERE carrid = p_carrid.
ENDFORM.

6-4. 2번 노드 추가하는 FORM

FORM add_node   USING    p_rkey p_text p_nkey.
  CLEAR p_nkey.
  CALL METHOD g_alv_tree->add_node 
    EXPORTING
      i_relat_node_key = p_rkey
      i_relationship   = cl_gui_column_tree=>relat_last_child
      i_node_text      = p_text
    IMPORTING
      e_new_node_key   = p_nkey.    "노드키 체번
ENDFORM.

이 메소드를 사용하면 노드키를 따로 지정하지 않아도 이 메소드가 노드키를 알아서 체번한다.

6-5. 3번 노드 추가하는 FORM

FORM add_alv_node  USING    p_rkey
                            p_text
                            p_stru LIKE gs_tab
                            p_nkey.
  CLEAR p_nkey.
  CALL METHOD g_alv_tree->add_node
    EXPORTING
      i_relat_node_key = p_rkey
      i_relationship   = cl_gui_column_tree=>relat_last_child
      i_node_text      = p_text
      is_outtab_line   = p_stru
    IMPORTING
      e_new_node_key   = p_nkey.

ENDFORM.

7. 화면에 생성된 노드 업데이트

  CALL METHOD g_alv_tree->frontend_update.
728x90
반응형

'ABAP' 카테고리의 다른 글

온라인 프로그램 생성해보기  (0) 2023.02.20
ALV Tree 2  (0) 2023.02.20
Simple Tree 2  (0) 2023.02.20
Simple Tree  (0) 2023.02.20
ALV 7  (0) 2023.02.16

댓글