본문 바로가기
ABAP

Simple Tree

by clode 2023. 2. 20.
728x90
반응형
  • TREE는 데이터가 상하관계를 가지고 있을 때, 데이터를 계층적으로 나열하고자 할 때 사용한다.
  • 단순 Tree 구조로 폴더와 텍스트로 이루어져있다.
  • Checkbox나, 추가적인 아이콘을 사용할 수 없다.
  • 1개의 Column을 가지기 때문에, 컬럼헤더가 존재하지 않는다.

Simple tree 예제

  • 순서
  1. 100번화면 왼쪽에 Tree를 넣을 Custom Control과 오른쪽에 ALV를 출력할 Control 생성 (화면 구성)
  2. PBO에서 SAP Simple Tree 인스턴스 생성 (화면 구성)
  3. PBO에서 Tree노드를 생성 (트리 노드 생성)
  4. 더블클릭 이벤트를 처리하기 위해 클래스를 선언 하고 이벤트 메소드를 등록한다. (이벤트 제어)
  5. Tree에서 더블클릭 이벤트를 사용하기 위해서 이벤트를 등록한다. (이벤트 제어)
  • 노드개념
    Root노드: 최상위 노드
    Parent, Child노드: A노드가 B를 가리킬때, A노드가 Parent노드, B노드는 Child노드이다.
    Leaf노드: 더 이상 Child노드가 없는노드이다. (최하위노드)

[프로그램 로직]

INCLUDE ZS1D11_030_TOP.              .    " Global Data

INCLUDE ZS1D11_030_O01.              .  " PBO-Modules
INCLUDE ZS1D11_030_I01.               .  " PAI-Modules
INCLUDE ZS1D11_030_F01.               .  " FORM-Routines


INITIALIZATION.   

AT SELECTION-SCREEN.

START-OF-SELECTION.     "메인 프로세스 시작
  PERFORM select_data.

END-OF-SELECTION.
  CALL SCREEN 100.

<TOP>

*TREE ALV
TYPES: node_table_type  LIKE STANDARD TABLE OF mtreesnode WITH DEFAULT KEY.
DATA:  tree_con_ref TYPE REF TO cl_gui_custom_container, "컨테이너
       g_tree       TYPE REF TO cl_gui_simple_tree.        "트리 컨테이너 참조변수

TABLES: sflight, scarr.

DATA:     gs_tab  TYPE sflight,
          gt_tab  TYPE TABLE OF sflight,
          gs_tab2 TYPE scarr,
          gt_tab2 TYPE TABLE OF scarr.     "

DATA: ok_code TYPE sy-ucomm.

*ALV 관련 데이터 오브젝트
DATA:     g_custom_con  TYPE REF TO cl_gui_custom_container,      "컨테이너
          g_alv         TYPE REF TO cl_gui_alv_grid.              "ALV GRID

DATA:    gs_fieldcat  TYPE lvc_s_fcat,
          gt_fieldcat  TYPE lvc_t_fcat,
          gs_layo      TYPE lvc_s_layo,
          gs_sort      TYPE lvc_s_sort,
          gt_sort      TYPE lvc_t_sort,
          gs_functions TYPE ui_functions,
          gs_refto     TYPE REF TO data,
          gs_pos       TYPE i.


FIELD-SYMBOLS : <fcat> TYPE lvc_t_fcat.

SELECT-OPTIONS: s_carrid FOR sflight-carrid.      "항공사 코드


CLASS lcl_application DEFINITION.
  PUBLIC SECTION.
    METHODS : handle_node_double_click
              FOR EVENT node_double_click OF cl_gui_simple_tree
      IMPORTING node_key.
ENDCLASS.                  


CLASS lcl_application IMPLEMENTATION.
  METHOD handle_node_double_click.
    PERFORM node_double_click_0100  USING node_key.
  ENDMETHOD.                    

ENDCLASS.                   

DATA: g_application TYPE REF TO lcl_application.

ALV과 유사하지만 TREE 관련 오브젝트를 추가로 선언한다.


<화면100>

트리를 그려줄 컨테이너와 ALV를 그려줄 컨테이너 두개를 생성해준다.

PROCESS BEFORE OUTPUT.
 MODULE STATUS_0100.
 MODULE INIT_TREE.
 MODULE CREATE_CONTAINER.

PROCESS AFTER INPUT.
 MODULE EXIT AT EXIT-COMMAND.
 MODULE USER_COMMAND_0100.

<PBO>

MODULE status_0100 OUTPUT.
  SET PF-STATUS '0100'.      "상태 설정
  SET TITLEBAR '0100'.       "제목 설정
ENDMODULE.


MODULE create_container OUTPUT.

  IF g_custom_con IS INITIAL. "PBO Module이  실행될때마다 실행되면 안되므로 커스텀컨테이너가 비어있을때만 로직을 수행한다. 

* 화면 100에 생성한 HD_CON을 참조하여 오브젝트 생성
    CREATE OBJECT g_custom_con
      EXPORTING
        container_name = 'CONT1'.

* ALV_CON위에 ALV 오브젝트를 생성한다.
    CREATE OBJECT g_alv
      EXPORTING
        i_parent = g_custom_con.

    PERFORM make_fieldcat.      "필드 카탈로그 설정

* ALV 출력
    CALL METHOD g_alv->set_table_for_first_display
      EXPORTING
        is_layout       = gs_layo
      CHANGING
        it_outtab       = gt_tab
      .
  ELSE.
    PERFORM refresh_grid.
  ENDIF.

ENDMODULE.

MODULE init_tree OUTPUT.
  IF g_tree IS INITIAL.
    DATA: node_table TYPE node_table_type, "트리 값들 관계 넣어주기위해
          events     TYPE cntl_simple_events, "더블클릭 이벤트
          event      TYPE cntl_simple_event.    "더블클릭 이벤트

*컨테이너 생성
    CREATE OBJECT tree_con_ref
      EXPORTING
        container_name = 'TREE1'.

*TREE 컨트롤 생성, CLASS를 INSTANCE
    CREATE OBJECT g_tree
      EXPORTING
        parent              = tree_con_ref
        node_selection_mode = cl_gui_simple_tree=>node_sel_mode_single. "싱글선택

*노드 생성
    PERFORM build_node_table USING node_table. "트리에 데이터 넣어줌

*트리 노드 추가
    CALL METHOD g_tree->add_nodes
      EXPORTING
        table_structure_name = 'MTREESNODE'
        node_table           = node_table. "트리 데이터 들어가있는 int

*이벤트
    CREATE OBJECT g_application.

    event-eventid = cl_gui_simple_tree=>eventid_node_double_click.
    event-appl_event = 'X'.
    APPEND event TO events.

*트리 이벤트 등록
    CALL METHOD g_tree->set_registered_events
      EXPORTING
        events                    = events
      EXCEPTIONS
        cntl_error                = 1
        cntl_system_error         = 2
        illegal_event_combination = 3.

*이벤트 헨들러
    SET HANDLER g_application->handle_node_double_click FOR g_tree.

  ENDIF.
ENDMODULE.
                 .

<PAI>

MODULE user_command_0100 INPUT.
  CASE ok_code.
    WHEN 'BACK'.
      LEAVE TO SCREEN 0.      "이전화면
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.


MODULE exit INPUT.
  CASE ok_code.
    WHEN 'EXIT' OR 'CANC'.
      LEAVE PROGRAM.      "프로그램 종료
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.

<FORM>

FORM select_data .
  SELECT * FROM scarr
    INTO TABLE gt_tab2
   WHERE carrid IN s_carrid.
ENDFORM.

* 필드카탈로그 구성
FORM make_fieldcat .
  gs_fieldcat-fieldname = 'CARRID'.
  gs_fieldcat-coltext = '항공사 코드'.
  gs_fieldcat-just = 'C'.
  gs_fieldcat-key = 'X'.
  APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.

  gs_fieldcat-fieldname = 'CONNID'.
  gs_fieldcat-coltext = '항공편 연결번호'.
  gs_fieldcat-just = 'C'.
  APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.

  gs_fieldcat-fieldname = 'FLDATE'.
  gs_fieldcat-coltext = '비행일자'.
  gs_fieldcat-just = 'C'.
  APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.

  gs_fieldcat-fieldname = 'PRICE'.
  gs_fieldcat-coltext = '금액'.
  gs_fieldcat-just = 'C'.
  APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.

  gs_fieldcat-fieldname = 'CURRENCY'.
  gs_fieldcat-coltext = '현지통화'.
  gs_fieldcat-just = 'C'.
  APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.

  gs_fieldcat-fieldname = 'SEATSMAX'.
  gs_fieldcat-coltext = '최대자석수'.
  gs_fieldcat-just = 'C'.
  APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.

  gs_fieldcat-fieldname = 'SEATSOCC'.
  gs_fieldcat-coltext = '점유좌석수'.
  gs_fieldcat-just = 'C'.
  APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.
ENDFORM.


FORM build_node_table  USING node_table TYPE node_table_type.
  DATA: node LIKE mtreesnode.

  CLEAR node.
  node-node_key = 'Root'.       "tree 상위항목
  node-isfolder = 'X'.        "폴더모양으로 표시
  node-text = '항공사'.        "항공사라는 텍스트로 표시
  APPEND node TO node_table.

  CLEAR node.
  node-node_key = 'Child1'. "root 하위 항목
  node-relatkey = 'Root'.
  node-isfolder = 'X'.
  node-text = '항공사 코드'.
  node-expander = 'X'. "아래에 확장해서 항공사 코드번호
  APPEND node TO node_table.

  LOOP AT gt_tab2 INTO gs_tab2.
    CLEAR node.
    node-node_key = gs_tab2-carrid.
    node-relatkey = 'Child1'.
    node-n_image = '@7T@'.
    node-text = gs_tab2-carrname.
    APPEND node TO node_table.
  ENDLOOP.
ENDFORM.

node-expander는 EXPAND_NO_CHILDREN(Event)를 (+)[펼치기] 버튼을 누를때 단1회 호출된다. Simple Tree에서는 사용에 의미가 없으나, 각 노드마다 데이타를 관리하는 이후 개체에서는 데이타를 Select해서 뿌려주기 위한 Event로 사용할 때 꼭 필요한 속성이다. 트리의 가장 마지막 항목에는 이 expander가 존재하면 안된다.

FORM refresh_grid .
  DATA: l_scroll TYPE lvc_s_stbl.
  l_scroll-row = 'X'.
  l_scroll-col = 'X'.
  CALL METHOD g_alv->refresh_table_display
    EXPORTING
      i_soft_refresh = ''
      is_stable      = l_scroll.
ENDFORM.

"더블클릭했을 때 뿌려줄 데이터
FORM node_double_click_0100  USING    p_node_key.
  SELECT * FROM sflight
    INTO TABLE gt_tab
   WHERE carrid = p_node_key.

  PERFORM refresh_grid.

ENDFORM.
728x90
반응형

'ABAP' 카테고리의 다른 글

ALV Tree  (0) 2023.02.20
Simple Tree 2  (0) 2023.02.20
ALV 7  (0) 2023.02.16
ALV 6 (필드카탈로그 구성)  (0) 2023.02.16
ALV 5 (SPLIT)  (0) 2023.02.16

댓글