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

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

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.

from http://haramang.tistory.com/85 by ccl(A) rewrite - 2021-10-28 14:26:19