728x90
반응형
Simple Tree를 사용하다 보니 항상 좌측에서 Simple Tree, 우측에는 상세내역 ALV를 가져다 사용해야 했다. 이걸 하나로 구성하기 위해 ALV를 Main으로 부가 Field 1개를 계층적으로 구성될 수 있도록 하는 ALV Tree를 사용한다.
ALV Tree는 ALV를 기준으로 추가기능적 요소가 결합된 형태로 구성되어 있다.
실습
항공사ID 단위로 트리를 구성하여 아래와 같이 보이도록 한다.
1. 데이터 선언
DATA: gt_tab TYPE TABLE OF sflight,
gs_tab TYPE sflight.
DATA: g_alv_tree TYPE REF TO cl_gui_alv_tree,
g_custom_container TYPE REF TO cl_gui_custom_container.
이번 예제는 ALV 컨테이너를 따로 그리지 않고 트리에 데이터가 바로 나오게 하므로 트리 컨테이너만 선언한다. 선언 후 SCREEN
100번에 컨테이너를 그려준다.
SELECT-OPTIONS: s_carrid FOR gs_tab-carrid.
초기 화면에 그려줄 항공사 코드를 범위값을 가진 필드로 그려준다.
프로그램이 CALL SCREEN 100을 만나면 화면100의 흐름로직을 탄다.
2. 트리 컨테이너 생성
CHECK g_custom_container IS INITIAL.
CREATE OBJECT g_custom_container
EXPORTING
container_name = 'TREE1'.
컨테이너가 비어있을때만 생성한다.
3. 트리 컨트롤 생성
CREATE OBJECT g_alv_tree
EXPORTING
parent = g_custom_container
node_selection_mode = cl_gui_column_tree=>node_sel_mode_single
item_selection = 'X'
no_html_header = 'X'
no_toolbar = ''.
4. 트리 헤더 생성
DATA l_hierarchy_header TYPE treev_hhdr.
PERFORM build_hierarchy_header CHANGING l_hierarchy_header.
FORM build_hierarchy_header CHANGING p_header TYPE treev_hhdr.
" 헤더 구성
p_header-heading = '항공편 번호'(300).
p_header-tooltip = '항공편 번호(ALV)'(400).
p_header-width = 40.
p_header-width_pix = ' '.
ENDFORM.
5. 트리 컨트롤 화면 출력
CALL METHOD g_alv_tree->set_table_for_first_display
EXPORTING
i_structure_name = 'SFLIGHT'
is_hierarchy_header = l_hierarchy_header
CHANGING
it_outtab = gt_tab. "빈 인터널 테이블이어야함
이때 outtab
에 사용하는 인터널테이블은 빈 인터널 테이블이어야한다. 그래서 select할때 이 인터널테이블을 참조하면서 데이터를 담을 인터널테이블을 이후 로컬로 따로 또 선언해준다.
6. 트리 노드 구성 ⭐⭐⭐
ALV TREE는 NODE KEY와 RELATE KEY만 잘 생각해주면 된다!!! 노드키와 관계 키만 구성을 잘하면 할줄 아는거다. 그래서 이부분이 제일 어려우면서 중요하다.
6-1. 트리 데이터 SELECT
트리에 데이터를 먼저 SELECT로 데이터를 가져와 인터널테이블에 담아준다.
PERFORM create_hierarchy.
FORM create_hierarchy .
"노드에 사용될 노드키와 관계키, 노드의 텍스트 변수
DATA: l_rkey1 TYPE lvc_nkey,
l_nkey1 TYPE lvc_nkey,
l_text1 TYPE lvc_value,
l_rkey2 TYPE lvc_nkey,
l_nkey2 TYPE lvc_nkey,
l_text2 TYPE lvc_value,
l_rkey3 TYPE lvc_nkey,
l_nkey3 TYPE lvc_nkey,
l_text3 TYPE lvc_value.
DATA: lt_tab LIKE gt_tab,
ls_tab LIKE gs_tab.
SELECT * FROM sflight
INTO TABLE lt_tab
WHERE carrid IN s_carrid.
SORT lt_tab BY carrid ASCENDING.
6-2. 트리 노드 구성 🌟
*최상위 노드
l_rkey1 = ''. "최상위는 연결된 키 없기때문에 빈값
l_text1 = '항공사'.
PERFORM add_node USING l_rkey1 l_text1 l_nkey1. "ROOT 추가
*하위 노드
LOOP AT lt_tab INTO ls_tab.
AT NEW carrid. "항공사 코드가 새로 시작될 때 수행
l_rkey2 = l_nkey1.
PERFORM get_carrname USING ls_tab-carrid l_text2. "항공사 이름 가져오기
PERFORM add_node USING l_rkey2 l_text2 l_nkey2. "노드 추가
ENDAT.
l_rkey3 = l_nkey2.
l_text3 = ls_tab-connid.
PERFORM add_alv_node USING l_rkey3 l_text3 ls_tab l_nkey3. "노드 추가
ENDLOOP.
ENDFORM.
6-3. 항공사 이름 가져오는 FORM
FORM get_carrname USING p_carrid p_text.
SELECT SINGLE carrname FROM scarr
INTO p_text
WHERE carrid = p_carrid.
ENDFORM.
6-4. 2번 노드 추가하는 FORM
FORM add_node USING p_rkey p_text p_nkey.
CLEAR p_nkey.
CALL METHOD g_alv_tree->add_node
EXPORTING
i_relat_node_key = p_rkey
i_relationship = cl_gui_column_tree=>relat_last_child
i_node_text = p_text
IMPORTING
e_new_node_key = p_nkey. "노드키 체번
ENDFORM.
이 메소드를 사용하면 노드키를 따로 지정하지 않아도 이 메소드가 노드키를 알아서 체번한다.
6-5. 3번 노드 추가하는 FORM
FORM add_alv_node USING p_rkey
p_text
p_stru LIKE gs_tab
p_nkey.
CLEAR p_nkey.
CALL METHOD g_alv_tree->add_node
EXPORTING
i_relat_node_key = p_rkey
i_relationship = cl_gui_column_tree=>relat_last_child
i_node_text = p_text
is_outtab_line = p_stru
IMPORTING
e_new_node_key = p_nkey.
ENDFORM.
7. 화면에 생성된 노드 업데이트
CALL METHOD g_alv_tree->frontend_update.
728x90
반응형
'ABAP' 카테고리의 다른 글
온라인 프로그램 생성해보기 (0) | 2023.02.20 |
---|---|
ALV Tree 2 (0) | 2023.02.20 |
Simple Tree 2 (0) | 2023.02.20 |
Simple Tree (0) | 2023.02.20 |
ALV 7 (0) | 2023.02.16 |
댓글