본문 바로가기
ABAP

ALV Tree 2

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

[실행화면]

1. 초기 화면 설정

PARAMETERS : s_month TYPE char2.

월을 나타내는 파라미터를 만들어준다. 사실 PARAMETERS : S_MONTH TYPE MONTH.로 하면 MONTH라는 구조가 이미 F4 도움말을 가지고 있기 때문에 이걸 사용하면 더 쉽지만 연습이기 때문에 직접서치헬프를 구문으로 달아본다.

DATA: BEGIN OF gs_month,
        key      TYPE char2,
        text(10),
      END OF gs_month,
      gt_month LIKE TABLE OF gs_month.

월을 담아줄 구조와 인터널테이블을 선언한다.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_MONTH.
  PERFORM f4_month.

FORM f4_month .
  DO 12 TIMES.
    ADD 1 TO gs_month-key.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' 
      EXPORTING
        input  = gs_month-key
      IMPORTING
        output = gs_month-key.
    APPEND gs_month TO gt_month.
  ENDDO.

1월은 1자리, 12월은 2자리로 자릿수가 다르기 때문에 1자리인 월 앞에는 0을 자동으로 넣어줘 자릿수 맞춰주는 펑션을 사용한다.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield    = 'key'         "f4하고 선택했을때 선택한값 뿌려지는 변수
      dynpprog    = sy-repid                "어떤프로그램인지
      dynpnr      = sy-dynnr
      dynprofield = 'S_MONTH'
      value_org   = 'S' "단일값 선택, COMPLEX 복합선택때는 C
    TABLES
      value_tab   = gt_month.

ENDFORM.

2. 트리 관련 데이터 선언

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

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

선언후 화면100을 생성해 트리를 만들어줄 컨테이너를 생성한다. 프로그램이 시작되면 CALL SCREEN 100을 만나 화면100의 흐름로직을 탄다.


3. 트리 컨테이너 생성

  CHECK g_custom_container IS INITIAL.

  CREATE OBJECT g_custom_container
    EXPORTING
      container_name              = 'TREE1'.

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

4. 트리 컨트롤 생성

  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          = ''.

5. 트리 헤더 생성

  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 = '서울1반 생일'(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    = 'ZS1D11T_02'
      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,
        lr_mon TYPE RANGE OF month,
        ls_mon LIKE LINE OF lr_mon.

  SELECT * FROM zs1d11t_02
    INTO TABLE lt_tab.
  IF s_month IS NOT INITIAL.
    ls_mon-low = s_month.
    ls_mon-sign = 'I'.
    ls_mon-option = 'EQ'.
    APPEND ls_mon TO lr_mon. CLEAR ls_mon.
  ELSE.
    CLEAR: lr_mon, lr_mon[].
  ENDIF.

6-2. 트리 노드 구성 🌟

  l_rkey1 = ''.
  l_text1 = '서울1반'.
  "1레벨 노드 추가
  PERFORM add_node USING l_rkey1 l_text1 l_nkey1.    "ROOT 추가

  DO 12 TIMES.
    ADD 1 TO gs_month-key.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = gs_month-key
      IMPORTING
        output = gs_month-key.
    APPEND gs_month TO gt_month.
  ENDDO.

  "1-12월 loop돌아 2레벨 노드구성
  LOOP AT gt_month INTO gs_month WHERE key IN lr_mon.
    l_rkey2 = l_nkey1.
    CONCATENATE gs_month-key '월' INTO l_text2. "2번노드 텍스트
    "2레벨 노드 추가
    PERFORM add_node USING l_rkey2 l_text2 l_nkey2.

    LOOP AT lt_tab INTO ls_tab.
      IF ls_tab-gbdat+4(2) = gs_month-key.
        l_rkey3 = l_nkey2.
        l_text3 = ls_tab-gbdat+4(4). "화면에 뿌려줄때 월일만 나오게
        "3레벨 노드 추가
        PERFORM add_alv_node USING l_rkey3 l_text3 ls_tab l_nkey3.
      ENDIF.
*    ELSE.
*      CONTINUE. "다음루프 수행, 조건에 해당하지 않을때 루프 건너뛰려고
    ENDLOOP.

  ENDLOOP.
 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
온라인 프로그램 생성해보기  (0) 2023.02.20
ALV Tree  (0) 2023.02.20
Simple Tree 2  (0) 2023.02.20
Simple Tree  (0) 2023.02.20

댓글