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.
'SAP > ABAP 코드' 카테고리의 다른 글
(ABAP 코드) 금액 총 합계 (DATA_CHANGED_FINISHED) (0) | 2021.10.28 |
---|---|
(ABAP 코드) 셀 이동 후, 커서 위치 다시 불러오기 (0) | 2021.10.28 |
(ABAP 코드) Date 포멧 변환 (0) | 2021.10.28 |
(ABAP 코드) Selection-Screen 실행버튼 정리 (0) | 2021.10.20 |
(ABAP 코드) 자주 사용 되는 펑션/메소드 모음 (0) | 2021.10.11 |