ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ABAP] #36 Tree
    SAP/ABAP 2026. 2. 2. 11:29

     

     

     

     

     

     

     

    Tree

    트리는 계층 구조(Hierarchy) 를 표현하는 자료 구조로,

    SAP에서는 조직도, 메뉴, BOM, 파일 구조 같은 걸 표현할 때 자주 사용한다.

     

    1. 루트 노드 (Root Node)

    • 트리의 가장 최상위 노드
    • 부모가 없는 노드
    • 트리는 루트 노드 1개를 기준으로 시작
    Root
     ├─ A
     │   └─ A-1
     └─ B
    • SAP Tree에서도 보통 node_key = 'ROOT' 같은 식으로 명시적으로 만든다.

     

    2. 노드 (Node)

    • 트리를 구성하는 각각의 요소
    • 실제 데이터 한 건 (부서, 메뉴, 항목 등)
    명칭 의미
    부모 노드 (Parent Node) 현재 노드를 직접 포함하고 있는 상위 노드
    자식 노드 (Child Node) 특정 노드 아래에 속한 노드들
    형제 노드 (Sibling Node) 같은 부모를 가진 노드들
    리프 노드 (Leaf Node) 자식이 없는 노드, 트리의 끝단

    Hierarchy Key

    • 부모–자식 관계를 연결하기 위한 키
    • SAP Tree / ALV Tree에서 노드의 관계를 정의하는 핵심

     

    핵심 구성

    요소 설명
    Node Key 현재 노드를 식별하는 고유 키
    Parent Key 이 노드의 부모 노드 키
    NODE_KEY     PARENT_KEY
    -----------------------
    ROOT         (공백)
    A            ROOT
    A-1          A
    B            ROOT
    • 이 두 개로 트리 구조가 결정됨

    Tree를 활용해서 파일 구조 구현하기

     

    1. 필요한 변수 선언

    * Tree 관련 변수 선언
    DATA: go_tree TYPE REF TO cl_gui_simple_tree, " 실제 트리 컨트롤 객체 "
          gs_node TYPE mtreesnode,                " 노드 1개 정보를 담는 구조 "
          gt_node TYPE TABLE OF mtreesnode.       " 여러 노드를 담아 트리를 구성하는 내부 테이블 "

     

    2. 트리 객체 생성 (이때 컨테이너와 연결)

    MODULE init_tree OUTPUT.
      IF go_tree IS INITIAL.
        CREATE OBJECT go_tree
          EXPORTING
            parent                      = go_cont " 트리를 붙일 컨테이너 "
            node_selection_mode         = cl_gui_simple_tree=>node_sel_mode_single " 노드 선택 방식 (단일 선택) "
          EXCEPTIONS
            lifetime_error              = 1
            cntl_system_error           = 2
            create_error                = 3
            failed                      = 4
            illegal_node_selection_mode = 5
            OTHERS                      = 6.
        IF sy-subrc = 0.
          PERFORM add_node.
          PERFORM set_node_events.
        ENDIF.
      ENDIF.
    ENDMODULE.

     

    3. 노드 생성

    FORM add_node .
      CLEAR gs_node.
      gs_node-node_key    = 'ROOT'.        " 노드 고유키 "
      gs_node-isfolder    = 'X'.           " 폴더 여부 "
      gs_node-text        = 'TREE Header'. " 화면 표시 텍스트 "
      gs_node-relatkey    = ' '.           " 부모 노드 고유키 "
      gs_node-n_image     = '@5C@'.        " 접힘 아이콘 "
      gs_node-exp_image   = '@5B@'.        " 펼침 아이콘 "
      APPEND gs_node TO gt_node.
    
      CLEAR gs_node.
      gs_node-node_key    = 'LV11'.
      gs_node-isfolder    = 'X'.
      gs_node-text        = '자식노드'.
      gs_node-relatkey    = 'ROOT'.
      gs_node-n_image     = '@5C@'.
      gs_node-exp_image   = '@5B@'.
      APPEND gs_node TO gt_node.
    
      CLEAR gs_node.
      gs_node-node_key    = 'LV21'.
      gs_node-isfolder    = 'X'.
      gs_node-text        = '형제노드'.
      gs_node-relatkey    = 'ROOT'.
      gs_node-n_image     = '@5C@'.
      gs_node-exp_image   = '@5B@'.
      APPEND gs_node TO gt_node.
    
      CLEAR gs_node.
      gs_node-node_key    = 'LV12'.
      gs_node-isfolder    = 'X'.
      gs_node-text        = '자식의 자식노드'.
      gs_node-relatkey    = 'LV11'.
      gs_node-n_image     = '@5D@'.
      gs_node-exp_image   = '@5G@'.
      APPEND gs_node TO gt_node.
    
      CLEAR gs_node.
      gs_node-node_key    = 'LV22'.
      gs_node-isfolder    = 'X'.
      gs_node-text        = '형제의 자식노드'.
      gs_node-relatkey    = 'LV21'.
      gs_node-n_image     = '@5D@'.
      gs_node-exp_image   = '@5G@'.
      APPEND gs_node TO gt_node.
    
      CALL METHOD go_tree->add_nodes
        EXPORTING
          table_structure_name           = 'MTREESNODE'
          node_table                     = gt_node
        EXCEPTIONS
          error_in_node_table            = 1
          failed                         = 2
          dp_error                       = 3
          table_structure_name_not_found = 4
          others                         = 5
              .
      IF sy-subrc <> 0.
    *   Implement suitable error handling here
      ENDIF.
    
    ENDFORM.

     

    4. 노드 클릭 시 폴더 열리게 이벤트 처리

    " DEFERRED = 선행 선언. Class 내용은 뒤에 나오니까, 선언 먼저 하겠다! "
    " 클래스 구현은 뒤에 있지만 참조 변수 먼저 선언하기 위해 선행 선언 "
    CLASS: lcl_node_event_handler DEFINITION DEFERRED.
    DATA: go_node_event TYPE REF TO lcl_node_event_handler.
    
    CLASS lcl_node_event_handler DEFINITION.
      PUBLIC SECTION.
        METHODS:
          double_click FOR EVENT node_double_click OF cl_gui_simple_tree IMPORTING node_key.
    ENDCLASS.
    
    CLASS lcl_node_event_handler IMPLEMENTATION.
      METHOD double_click.
        MESSAGE node_key TYPE 'E' DISPLAY LIKE 'S'.
      ENDMETHOD.
    ENDCLASS.

     

    5. 이벤트 등록

    FORM set_node_events .
      DATA: lt_events TYPE cntl_simple_events,
            ls_event  TYPE cntl_simple_event.
    
      CREATE OBJECT go_node_event.
    
      SET HANDLER: go_node_event->double_click FOR go_tree.
    
      " tree 객체에도, 실행할 이벤트가 어떤건지 알려줘야 함 "
      ls_event-eventid = cl_gui_simple_tree=>eventid_node_double_click.
    
      " tree가 속한 화면(100번)의 PAI를 먼저 실행함 "
      ls_event-appl_event = 'X'.
      append ls_event to lt_events.
    
      go_tree->set_registered_events(
        EXPORTING
          events                    = lt_events        " Event Table "
        EXCEPTIONS
          cntl_error                = 1                " cntl_error "
          cntl_system_error         = 2                " cntl_system_error "
          illegal_event_combination = 3                " ILLEGAL_EVENT_COMBINATION "
          others                    = 4
      ).
      IF SY-SUBRC <> 0.
      ENDIF.
    
    ENDFORM.

     

     

     

     

     

     

     

    'SAP > ABAP' 카테고리의 다른 글

    [ABAP] #38 교육 시스템 프로그램 실습  (1) 2026.03.04
    [ABAP] #37 ABAP 신문법  (1) 2026.02.03
    [ABAP] #35 Field Symbols + Excel Upload  (1) 2026.01.31
    [ABAP] #34 ABAP OOP - Class (2)  (0) 2026.01.25
    [ABAP] #33 ABAP OOP - Class (1)  (0) 2026.01.16
Designed by Tistory.