SAP/ABAP 코드

(ABAP 코드) Column Tree 생성 및 관리

haramang 2021. 10. 28. 14:10

Column Tree 생성과정

 

1. 컨테이너 생성

2. Tree 오브젝트 생성 

 

  " 트리 오브젝트 생성
DATA: hierarchy_header TYPE treev_hhdr.
DATA: go_tree             TYPE REF TO cl_gui_column_tree.


" 트리 헤더 세팅
  CREATE OBJECT go_tree
    EXPORTING
      parent                      = go_tree_container
      node_selection_mode         = cl_gui_column_tree=>node_sel_mode_single  " 노드 선택 하나만 가능
      item_selection              = 'X'      " 아이템 선택가능
      hierarchy_column_name       = 'HEAD'   " 열 명칭 ( 아이템 배정에 필요한 이름 )
      hierarchy_header            = hierarchy_header
    EXCEPTIONS
      lifetime_error              = 1
      cntl_system_error           = 2
      create_error                = 3
      illegal_node_selection_mode = 4
      failed                      = 5
      illegal_column_name         = 6
      OTHERS                      = 7.

3. 열 추가

  " 열 추가 ( 코스트센터 / 원가요소의 명칭 )
  CALL METHOD go_tree->add_column
    EXPORTING
      name        = 'KTEXT'
      width       = 20
      header_text = '내역'.

  " 열 추가 ( 상태 아이콘 )
  CALL METHOD go_tree->add_column
    EXPORTING
      name        = 'ID'
      width       = 6
      header_text = '상태'.

  " 열 추가 ( 변경자 )
  CALL METHOD go_tree->add_column
    EXPORTING
      name        = 'UPNAM'
      width       = 20
      header_text = '변경자'.

  " 열 추가 ( 변경일  )
  CALL METHOD go_tree->add_column
    EXPORTING
      name        = 'UPDAT'
      width       = 10
      header_text = '변경일'.

4. 노드 / 아이템 세팅

 

  
PERFORM build_node_and_item_tab CHANGING gt_node_tab
                                           gt_tree_itm
.

FORM build_node_and_item_tab  CHANGING  p_node_table TYPE treev_ntab
                                        pt_tree_itm  TYPE item_table_type.

  DATA: node TYPE treev_node,               " 노드 / 아이템 구조체
        item TYPE mtreeitm.

  DATA: ls_t_plan LIKE gs_t_plan,           " 비용처리계획 임시 테이블
        lt_t_plan LIKE TABLE OF gs_t_plan.

  DATA: lv_parent TYPE i,                    " 부모 키
        lv_child  TYPE i.                    " 자식 키

  lt_t_plan[] = gt_t_plan[].                 " 비용처리계획 마스터 데이터를 임시 저장 테이블에 할당

" 데이터가 없을 경우, EXIT
  IF lt_t_plan IS INITIAL.
    MESSAGE s000 WITH '해당 조건의 데이터가 존재하지 않습니다.' DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.

" 비용처리계획 임시테이블 기준으로 LOOP
  LOOP AT lt_t_plan INTO ls_t_plan.

    " 코스트센터가 바뀔 때마다, 해당 코스트센터 아이디로 부모노드 생성
    ON CHANGE OF ls_t_plan-kostl.
      node-node_key  = ls_t_plan-kostl.    " 노드 키
      node-isfolder = 'X'.                 " 폴더 - 펼칠 수 있음
      node-expander = 'X'.                 " 폴더펼칠 때 이벤트 발생
      APPEND node TO p_node_table.

      " 해당 노드의 아이템 생성 ---------------------------------------------------------
      item-node_key  = node-node_key.      " 노드 키
      item-item_name = 'HEAD'.             " 아이템이 세팅 될 열의 이름
      item-text = ls_t_plan-kostl.         " 아이템 텍스트 ( 노드에 보여질 텍스트 )
      APPEND item TO pt_tree_itm.
      CLEAR: item.

      item-node_key  = node-node_key.
      item-item_name = 'KTEXT'.
      item-text = ls_t_plan-kostl_nam.
      APPEND item TO pt_tree_itm.
      CLEAR: item.

      item-node_key  = node-node_key.
      item-item_name = 'ID'.
      item-t_image   = icon_green_light.
      APPEND item TO pt_tree_itm.
      CLEAR: item.

      item-node_key  = node-node_key.
      item-item_name = 'UPNAM'.
      IF ls_t_plan-upnam IS NOT INITIAL.
        item-text = ls_t_plan-upnam.
      ELSE.
        item-text = ls_t_plan-crnam.
      ENDIF.

      APPEND item TO pt_tree_itm.
      CLEAR: item.

      item-node_key  = node-node_key.
      item-item_name = 'UPDAT'.

      IF ls_t_plan-updat IS NOT INITIAL.
        item-text = ls_t_plan-updat.
      ELSE.
        item-text = ls_t_plan-crdat.
      ENDIF.
      APPEND item TO pt_tree_itm.


      CLEAR: item.
      CLEAR: node.

    ENDON.


    " 원가요소 노드 / 아이템 세팅 --------------------------------------------
    " 노드세팅
    node-node_key  = ls_t_plan-kostl + ls_t_plan-kstar.    " 노드 키 - 동일한 원가요소가 코스트센터마다 할당되어서
                                                           " 중복된 값을 가질 수 있기 때문에, 코스트센터와 원가요소를 더한 값을
                                                           " 키 값으로 지정.
                                                           " 노드키가 중복될 경우, 트리 생성이 안됨

    node-relatkey  = ls_t_plan-kostl.                      " 해당 노드의 상위 노드 키 지정 ( 코스트센터 )
    node-relatship = cl_gui_column_tree=>relat_last_child. " 마지막 자식 노드로 지정
    APPEND node TO p_node_table.

    " 아이템 세팅 ---------------------------------------------------------
    item-node_key  = node-node_key.                        " 노드 키
    item-item_name = 'HEAD'.                               " 아이템이 세팅 될 열 이름
    item-text = ls_t_plan-kstar.                           " 아이템 텍스트 ( 화면에 보여지는 텍스트 )
    APPEND item TO pt_tree_itm.
    CLEAR: item.

    item-node_key  = node-node_key.
    item-item_name = 'KTEXT'.
    item-text = ls_t_plan-kstar_nam.
    APPEND item TO pt_tree_itm.
    CLEAR: item.

    item-node_key  = node-node_key.
    item-item_name = 'ID'.
    item-t_image   = icon_green_light.
    APPEND item TO pt_tree_itm.
    CLEAR: item.

    item-node_key  = node-node_key.
    item-item_name = 'UPNAM'.

    " 변경이력이 없을 경우, 생성자로 세팅
    IF ls_t_plan-upnam IS NOT INITIAL.
      item-text = ls_t_plan-upnam.
    ELSE.
      item-text = ls_t_plan-crnam.
    ENDIF.

    APPEND item TO pt_tree_itm.
    CLEAR: item.

    " 변경이력이 없을 경우, 생성일자로 세팅
    item-node_key  = node-node_key.
    item-item_name = 'UPDAT'.

    IF ls_t_plan-updat IS NOT INITIAL.
      item-text = ls_t_plan-updat.
    ELSE.
      item-text = ls_t_plan-crdat.
    ENDIF.
    APPEND item TO pt_tree_itm.

    CLEAR: item.
    CLEAR: ls_t_plan, node.


  ENDLOOP.

ENDFORM.

5. 세팅한 노드와 아이템을 트리에 세팅

  " 세팅된 노드테이블과 아이템 세팅 테이블을 이용하여 노드와 아이템을 트리에 세팅
  CALL METHOD go_tree->add_nodes_and_items
    EXPORTING
      node_table                     = gt_node_tab   " 노드키 저장 테이블
      item_table                     = gt_tree_itm   " 아이템 저장 테이블
      item_table_structure_name      = 'MTREEITM'    " 아이템 테이블 구조체 타입
    EXCEPTIONS
      failed                         = 1
      cntl_system_error              = 3
      error_in_tables                = 4
      dp_error                       = 5
      table_structure_name_not_found = 6.

6. 이벤트 등록

*   트리에 이벤트 할당
PERFORM set_event_tree        USING    go_tree.


FORM set_event_tree  USING    po_tree
                              TYPE REF TO cl_gui_column_tree.

  DATA: lt_event TYPE cntl_simple_events,     " 이벤트 변수
        ls_event LIKE LINE OF lt_event.

  DATA: lo_tree_event_handler TYPE REF TO lcl_tree_event_handler. " 이벤트 클래스

  " 이벤트 클레스 오브젝트 생성
  CREATE OBJECT lo_tree_event_handler.

  CLEAR: ls_event, lt_event[].


  " Tree 이벤트 - 아이템 더블클릭 이벤트 세팅
  ls_event-eventid = cl_gui_column_tree=>eventid_item_double_click.
  ls_event-appl_event = 'X'. " process PAI if event occurs
  APPEND ls_event TO lt_event.
  CLEAR: ls_event.

  " Tree 이벤트 등록
  CALL METHOD po_tree->set_registered_events
    EXPORTING
      events                    = lt_event
    EXCEPTIONS
      cntl_error                = 1
      cntl_system_error         = 2
      illegal_event_combination = 3.

  " Set
  SET HANDLER lo_tree_event_handler->item_double_click    FOR po_tree.

ENDFORM.

 

 

 

 

------------------------------------------------------------------------------------------

노드 삭제시, 따로 보관방법 - 유저가 노드 삭제 취소할 때를 대비해서 저장해 놈

 

* 삭제 노드 테이블 - 삭제 된 노드 관리,복구용
DATA: BEGIN OF gs_d_node_tab,
        tv_nodekey TYPE tv_nodekey,
        text       TYPE c LENGTH 30,
        parent     TYPE tv_nodekey,
        ktext      TYPE ktext,
      END OF gs_d_node_tab,
      gt_d_node_tab LIKE TABLE OF gs_d_node_tab.

 

 

  DATA: lt_d_node_tab TYPE treev_nks,
        lv_d_node     TYPE tv_nodekey.  " 임시 삭제 테이블
  DATA: ls_rows TYPE lvc_s_roid,
        lt_rows TYPE lvc_t_roid.
  DATA: lv_answer TYPE c.              " POP-UP 답변
  DATA: lt_d_node_tab TYPE treev_nks,
        lv_d_node     TYPE tv_nodekey.  " 임시 삭제 테이블
  " 선택된 라인 역순으로 정렬.
  SORT lt_rows BY row_id DESCENDING.

  LOOP AT lt_rows INTO ls_rows.

    READ TABLE gt_t_plan INTO gs_t_plan INDEX ls_rows-row_id.
    IF sy-subrc = 0.

      " DB에 있는 데이터만 삭제 테이블에 저장
      IF gs_t_plan-db = 'X'.
        MOVE-CORRESPONDING gs_t_plan TO gs_d_plan.
        APPEND gs_d_plan TO gt_d_plan.
        DELETE gt_t_plan INDEX ls_rows-row_id.


        " 삭제할 노드 저장
        gs_d_node_tab-tv_nodekey = gs_t_plan-kostl + gs_t_plan-kstar.
        gs_d_node_tab-parent     = gs_t_plan-kostl.
        gs_d_node_tab-text       = gs_t_plan-kstar.
        gs_d_node_tab-ktext      = gs_t_plan-kstar_nam.
        APPEND gs_d_node_tab TO gt_d_node_tab.
        CLEAR gs_d_node_tab.


        lv_d_node = gs_t_plan-kostl + gs_t_plan-kstar.
        APPEND lv_d_node TO lt_d_node_tab[].
        CLEAR lv_d_node.
      ENDIF.
    ENDIF.

    CLEAR: ls_rows, gs_t_plan, gs_d_plan.
  ENDLOOP.

  " 삭제할 노드가 존재할 경우,
  IF gt_d_node_tab[] IS NOT INITIAL.
    CALL METHOD go_tree->delete_nodes
      EXPORTING
        node_key_table          = lt_d_node_tab
      EXCEPTIONS
        failed                  = 1
        cntl_system_error       = 2
        error_in_node_key_table = 3
        dp_error                = 4
        OTHERS                  = 5.
  ENDIF.

  CLEAR: lt_d_node_tab[].
  gv_deleted = 'X'.

 

 

------------------------------------------------------------------------------------------------

노드에 신규추가가 발생했을 경우, 트리와 아이템 테이블에 추가하고 메소드를 사용하여 추가

- 글로벌 트리에도 추가를 하면, 추후에 노드 관리도 편함

 

      " 신규 아이템 노드 및 아이템 추가
      CALL METHOD go_tree->add_nodes_and_items
        EXPORTING
          node_table                     = lt_node_tab
          item_table                     = lt_tree_itm
          item_table_structure_name      = 'MTREEITM'
        EXCEPTIONS
          failed                         = 1
          cntl_system_error              = 3
          error_in_tables                = 4
          dp_error                       = 5
          table_structure_name_not_found = 6.