728x90
반응형
- TREE는 데이터가 상하관계를 가지고 있을 때, 데이터를 계층적으로 나열하고자 할 때 사용한다.
- 단순 Tree 구조로 폴더와 텍스트로 이루어져있다.
- Checkbox나, 추가적인 아이콘을 사용할 수 없다.
- 1개의 Column을 가지기 때문에, 컬럼헤더가 존재하지 않는다.
Simple tree 예제
- 순서
- 100번화면 왼쪽에 Tree를 넣을 Custom Control과 오른쪽에 ALV를 출력할 Control 생성 (화면 구성)
- PBO에서 SAP Simple Tree 인스턴스 생성 (화면 구성)
- PBO에서 Tree노드를 생성 (트리 노드 생성)
- 더블클릭 이벤트를 처리하기 위해 클래스를 선언 하고 이벤트 메소드를 등록한다. (이벤트 제어)
- 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 |
댓글