ABAP

ALV Tree

clode 2023. 2. 20. 16:14
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
반응형