Simple, Column, List Tree 비교
CL_GUI_SIMPLE_TREE
CL_GUI_COLUMN_TREE
CL_GUI_LIST_TREE
동일한 노드/스타일에 대해 3가지 트리를 비교하였습니다.
기능상 차이는 없으나 노드를 표현하는 방식이나 글꼴이 각 트리의 목적성에 따라 서로 다르게 표현됩니다.
> Simple tree : 단일 컬럼으로 가장 단순하게 계층구조를 표현하기에 적합
> Column tree : 노드의 정보를 여러 컬럼으로 구분하여 표현하기에 적합
> List tree : 노드의 정보를 표현할때 헤더와 내역을 가변적으로 표현(정형화된 컬럼으로 표현하기 어려울 경우)하기에 적합
※ 이외에도 계층구조 레벨이 고정적이라면 CL_GUI_ALV_TREE_SIMPLE 를 이용하여 많은 양의 데이터/컬럼을 CL_GUI_ALV_GRID와 동일한 사용방법으로 간편하게 트리를 표현할 수 있습니다.
# 소스코드
REPORT YSAND_BOX.
* Selection Screen
PARAMETERS: P_KOKRS TYPE TKA01-KOKRS OBLIGATORY MEMORY ID CAC,
P_CLASS TYPE SETHEADER-SETCLASS OBLIGATORY DEFAULT '0101',
P_SETNM TYPE SETHEADER-SETNAME.
SELECTION-SCREEN SKIP 1.
PARAMETERS P_ITM_SE AS CHECKBOX. "아이템 선택 가능 여부
* 트리관련 전역 변수
DATA: GO_GUI_SIMPLE_TREE TYPE REF TO CL_GUI_SIMPLE_TREE, "SIMPLE TREE
GO_GUI_COLUMN_TREE TYPE REF TO CL_GUI_COLUMN_TREE, "COLUMN TREE
GO_GUI_LIST_TREE TYPE REF TO CL_GUI_LIST_TREE. "LIST TREE
DATA: GT_NODES TYPE STANDARD TABLE OF MTREESNODE, "트리에 표시할 노드
GT_ITEMS TYPE STANDARD TABLE OF MTREEITM, "트리 노드의 컬럼
GS_HIERARCHY_HEADER TYPE TREEV_HHDR, "트리의 Hierarchy 헤더
GV_HIERARCHY_COLUMN_NAME TYPE TV_ITMNAME, "트리의 Hierarchy 컬럼 이름(CL_GUI_COLUMN_TREE에서 사용)
GS_LIST_HEADER TYPE TREEV_LHDR, "트리의 List 헤더(CL_GUI_LIST_TREE에서 사용)
GV_ITEM_SELECTION TYPE C. "트리의 아이템(노드의 컬럼) 선택 가능 여부
DATA GO_SPLITTER_CONTAINER TYPE REF TO CL_GUI_SPLITTER_CONTAINER.
* 트리 이벤트
CLASS LCL_TREE_EVENT_RECEIVER DEFINITION.
PUBLIC SECTION .
DATA TREE_OBJECT TYPE REF TO CL_TREE_CONTROL_BASE.
METHODS CONSTRUCTOR IMPORTING I_TREE_OBJECT TYPE REF TO CL_TREE_CONTROL_BASE.
METHODS: HANDLE_NODE_DOUBLE_CLICK FOR EVENT NODE_DOUBLE_CLICK OF CL_TREE_CONTROL_BASE IMPORTING NODE_KEY,
HANDLE_ITEM_DOUBLE_CLICK FOR EVENT ITEM_DOUBLE_CLICK OF CL_ITEM_TREE_CONTROL IMPORTING NODE_KEY
ITEM_NAME.
ENDCLASS.
CLASS LCL_TREE_EVENT_RECEIVER IMPLEMENTATION.
METHOD CONSTRUCTOR.
CALL METHOD SUPER->CONSTRUCTOR.
TREE_OBJECT = I_TREE_OBJECT.
ENDMETHOD.
METHOD HANDLE_NODE_DOUBLE_CLICK.
IF GT_NODES[ NODE_KEY = NODE_KEY ]-ISFOLDER EQ 'X'. "현재 노드가 폴더면 펼치기
TREE_OBJECT->EXPAND_NODE(
EXPORTING
NODE_KEY = NODE_KEY
* LEVEL_COUNT =
* EXPAND_SUBTREE =
EXCEPTIONS
FAILED = 1
ILLEGAL_LEVEL_COUNT = 2
CNTL_SYSTEM_ERROR = 3
NODE_NOT_FOUND = 4
CANNOT_EXPAND_LEAF = 5
others = 6
).
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ELSE.
MESSAGE I000(0K) WITH NODE_KEY.
ENDIF.
ENDMETHOD.
METHOD HANDLE_ITEM_DOUBLE_CLICK.
MESSAGE I000(0K) WITH NODE_KEY ITEM_NAME.
ENDMETHOD.
ENDCLASS.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_SETNM.
PERFORM F4_SET_GROUP CHANGING P_SETNM.
START-OF-SELECTION.
SELECT SINGLE
*
FROM TKA01
WHERE KOKRS EQ @P_KOKRS
INTO @DATA(LS_TKA01).
IF SY-SUBRC NE 0.
EXIT.
ENDIF.
DATA(LV_KHINR) = COND #( WHEN P_SETNM IS NOT INITIAL THEN P_SETNM ELSE
SWITCH #( P_CLASS WHEN '0101' THEN LS_TKA01-KHINR "코스트센터 그룹
WHEN '0106' THEN LS_TKA01-PHINR "손익센터 그룹
WHEN '0102' THEN 'K8000' "원가요소그룹
) ).
DATA(LV_SUBCLASS) = SWITCH #( P_CLASS WHEN '0102' THEN LS_TKA01-KTOPL
ELSE P_KOKRS ).
CHECK LV_KHINR IS NOT INITIAL.
"트리에 표시할 노드 데이터
CLEAR: GT_NODES, GT_ITEMS, GS_HIERARCHY_HEADER.
PERFORM SET_NODES USING P_KOKRS
P_CLASS
LV_SUBCLASS
LV_KHINR.
"트리가 포함된 스크린 호출
CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& Form SET_NODES
*&---------------------------------------------------------------------*
* SET 데이터를 이용하여 트리형태 구성
*----------------------------------------------------------------------*
* -->P_0050 text
*----------------------------------------------------------------------*
FORM SET_NODES USING P_KOKRS
P_SETCLASS
P_SUBCLASS
P_SETNAME.
DATA(LS_MASTER_DATA) = VALUE GRPHP1( MDCHECK = 'X'
BREAKINT = 'X'
SHOWTXT = 'X' ).
DATA: LT_NODES TYPE GSETH_NODE_TAB,
LT_VALUES_STD TYPE GSETH_VAL_TAB,
LT_MASTER_STD TYPE GSETH_MD_TAB,
LT_VALUES TYPE SORTED TABLE OF GSETH_VAL_LINE WITH NON-UNIQUE KEY SETID,
LT_MASTER_DATA TYPE SORTED TABLE OF GSETH_MD_LINE WITH NON-UNIQUE KEY NAME,
LS_INFO TYPE GRPHINFO,
LV_OVERWRITE TYPE SY-DATAR VALUE 'X',
LV_SETID TYPE SETHIER-SETID,
LV_RELATKEY TYPE TV_NODEKEY,
LV_TABIX TYPE SY-TABIX.
RANGES LR_LEAF FOR SETLEAF-VALFROM.
LV_SETID = |{ P_SETCLASS }{ P_SUBCLASS }{ P_SETNAME }|.
CALL FUNCTION 'K_HIERARCHY_TABLES_READ'
EXPORTING
E_CLASS = P_SETCLASS
E_SETID = LV_SETID
E_KOKRS = P_KOKRS
E_MASTER_DATA = LS_MASTER_DATA
TABLES
T_NODES = LT_NODES
T_VALUES = LT_VALUES_STD
T_MASTER_DATA = LT_MASTER_STD
CHANGING
C_INFO = LS_INFO
C_OVERWRITE = LV_OVERWRITE
EXCEPTIONS
NO_CONTROLLING_AREA = 1
NO_CHART_OF_ACCOUNT = 2
DIFFERENT_CONTROLLING_AREAS = 3
DIFFERENT_CHART_OF_ACCOUNTS = 4
SET_NOT_FOUND = 5
ILLEGAL_FIELD_REPLACEMENT = 6
ILLEGAL_TABLE_REPLACEMENT = 7
FM_RAISE = 8
CONVERT_ERROR = 9
NO_OVERWRITE_STANDARD_HIER = 10
NO_BUKRS_FOR_KOKRS = 11
OTHERS = 12
.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
EXIT.
ENDIF.
LT_VALUES = CORRESPONDING #( LT_VALUES_STD ).
LT_MASTER_DATA = CORRESPONDING #( LT_MASTER_STD ).
LOOP AT LT_NODES INTO DATA(LS_NODES).
LV_TABIX = SY-TABIX.
"상위노드 찾기
CLEAR LV_RELATKEY.
IF LS_NODES-HLEVEL > 0.
WHILE LV_TABIX > 1.
ADD -1 TO LV_TABIX.
IF LT_NODES[ LV_TABIX ]-HLEVEL EQ LS_NODES-HLEVEL - 1.
LV_RELATKEY = LT_NODES[ LV_TABIX ]-SHORTNAME.
EXIT.
ENDIF.
ENDWHILE.
ENDIF.
"CLASS
"CL_GUI_COLUMN_TREE=>ITEM_CLASS_TEXT.
"CL_GUI_COLUMN_TREE=>ITEM_CLASS_CHECKBOX.
"CL_GUI_COLUMN_TREE=>ITEM_CLASS_BUTTON.
"CL_GUI_COLUMN_TREE=>ITEM_CLASS_LINK.
"STYLE
"CL_TREE_CONTROL_BASE=>STYLE_DEFAULT "Normal
"CL_TREE_CONTROL_BASE=>STYLE_INACTIVE "Grey
"CL_TREE_CONTROL_BASE=>STYLE_INTENSIFD_CRITICAL "Red
"CL_TREE_CONTROL_BASE=>STYLE_INTENSIFIED "Blue
"CL_TREE_CONTROL_BASE=>STYLE_EMPHASIZED "Yellow background
"CL_TREE_CONTROL_BASE=>STYLE_EMPHASIZED_NEGATIVE "Red background
"CL_TREE_CONTROL_BASE=>STYLE_EMPHASIZED_POSITIVE "Green background
"CL_TREE_CONTROL_BASE=>STYLE_EMPHASIZED_A "Blue background
"CL_TREE_CONTROL_BASE=>STYLE_EMPHASIZED_B "Grey background
"CL_TREE_CONTROL_BASE=>STYLE_EMPHASIZED_C "Orange background
"노드 추가
APPEND VALUE #( NODE_KEY = LS_NODES-SHORTNAME "노드키
RELATKEY = LV_RELATKEY "상위 노드키
HIDDEN = ' ' "숨김 여부
DISABLED = ' ' "이벤트 비활성화 여부
ISFOLDER = 'X' "폴더 여부 (SPACE는 Leaf로 표시)
N_IMAGE = ICON_TREE "기본 이미지
EXP_IMAGE = ICON_TREE "펼쳤을때 이미지
STYLE = SWITCH #( LS_NODES-HLEVEL WHEN 0 THEN CL_TREE_CONTROL_BASE=>STYLE_EMPHASIZED_POSITIVE
ELSE CL_TREE_CONTROL_BASE=>STYLE_EMPHASIZED_C )
LAST_HITEM = '1' "어느 컬럼까지를 HIERARCHY 로 표현할 것인지 필드명 입력
TEXT = |{ LS_NODES-SHORTNAME }{ COND #( WHEN LS_NODES-DESCRIPT IS NOT INITIAL THEN | - { LS_NODES-DESCRIPT }| ) }| ) TO GT_NODES.
"노드의 아이템(컬럼) 추가
APPEND VALUE #( NODE_KEY = LS_NODES-SHORTNAME
ITEM_NAME = '1' "열이름 (LIST TREE에서는 숫자로만 사용)
CLASS = CL_GUI_COLUMN_TREE=>ITEM_CLASS_TEXT "표시형식
T_IMAGE = ' ' "아이콘
STYLE = SWITCH #( LS_NODES-HLEVEL WHEN 0 THEN ' '
ELSE CL_TREE_CONTROL_BASE=>STYLE_INTENSIFD_CRITICAL )
LENGTH = 10 "표시 길이(LIST TREE에서만 사용)
TEXT = LS_NODES-SHORTNAME ) TO GT_ITEMS.
APPEND VALUE #( NODE_KEY = LS_NODES-SHORTNAME
ITEM_NAME = '2' "열이름 (LIST TREE에서는 숫자로만 사용)
CLASS = CL_GUI_COLUMN_TREE=>ITEM_CLASS_TEXT "표시형식
T_IMAGE = ' ' "아이콘
STYLE = ' '
LENGTH = 20 "표시 길이(LIST TREE에서만 사용)
TEXT = LS_NODES-DESCRIPT ) TO GT_ITEMS.
CLEAR LR_LEAF[].
LOOP AT LT_VALUES INTO DATA(LS_VALUES) WHERE SETID EQ LS_NODES-SETID.
APPEND VALUE #( SIGN = 'I' OPTION = 'BT'
LOW = LS_VALUES-VFROM
HIGH = LS_VALUES-VTO ) TO LR_LEAF.
ENDLOOP.
IF LR_LEAF[] IS NOT INITIAL.
"노드(리프) 추가
LOOP AT LT_MASTER_DATA INTO DATA(LS_LEAF) WHERE NAME IN LR_LEAF.
APPEND VALUE #( NODE_KEY = LS_LEAF-NAME "노드키
RELATKEY = LS_NODES-SHORTNAME "상위 노드키
HIDDEN = ' ' "숨김 여부
DISABLED = ' ' "이벤트 비활성화 여부
ISFOLDER = ' ' "폴더 여부 (SPACE는 Leaf로 표시)
N_IMAGE = SWITCH #( P_SETCLASS WHEN '0101' THEN ICON_COST_CENTER WHEN '0106' THEN ICON_PROFIT_CENTER ) "기본 이미지
LAST_HITEM = '1' "어느 컬럼까지를 HIERARCHY 로 표현할 것인지 필드명 입력
TEXT = |{ CONDENSE( |{ LS_LEAF-NAME ALPHA = OUT }| ) }{ COND #( WHEN LS_LEAF-TEXT IS NOT INITIAL THEN | - { LS_LEAF-TEXT }| ) }| ) TO GT_NODES.
"노드의 아이템(컬럼) 추가
APPEND VALUE #( NODE_KEY = LS_LEAF-NAME
ITEM_NAME = '1' "열이름 (LIST TREE에서는 숫자로만 사용)
CLASS = CL_GUI_COLUMN_TREE=>ITEM_CLASS_TEXT "표시형식
T_IMAGE = ' ' "아이콘
STYLE = ' '
LENGTH = 10 "표시 길이(LIST TREE에서만 사용)
TEXT = CONDENSE( |{ LS_LEAF-NAME ALPHA = OUT }| ) ) TO GT_ITEMS.
APPEND VALUE #( NODE_KEY = LS_LEAF-NAME
ITEM_NAME = '2' "열이름 (LIST TREE에서는 숫자로만 사용)
CLASS = CL_GUI_COLUMN_TREE=>ITEM_CLASS_TEXT "표시형식
T_IMAGE = ICON_LED_GREEN "아이콘
STYLE = ' '
LENGTH = 20 "표시 길이(LIST TREE에서만 사용)
TEXT = LS_LEAF-TEXT ) TO GT_ITEMS.
APPEND VALUE #( NODE_KEY = LS_LEAF-NAME
ITEM_NAME = '3' "열이름 (LIST TREE에서는 숫자로만 사용)
CLASS = CL_GUI_LIST_TREE=>ITEM_CLASS_TEXT "표시형식
T_IMAGE = ICON_LED_GREEN "아이콘
STYLE = CL_TREE_CONTROL_BASE=>STYLE_EMPHASIZED_C "Orange background
LENGTH = 30 "표시 길이(LIST TREE에서만 사용)
TEXT = '추가적인 설명.....' ) TO GT_ITEMS.
ENDLOOP.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CREATE_CONTAINER
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM CREATE_CONTAINER.
CHECK GO_SPLITTER_CONTAINER IS INITIAL.
"트리를 표시한 컨테이너 생성
CREATE OBJECT GO_SPLITTER_CONTAINER
EXPORTING
PARENT = CL_GUI_CONTAINER=>SCREEN0
ROWS = 1
COLUMNS = 3
EXCEPTIONS
CNTL_ERROR = 1
CNTL_SYSTEM_ERROR = 2
others = 3.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
EXIT.
ENDIF.
DATA(LO_GUI_CONTAINER1) = GO_SPLITTER_CONTAINER->GET_CONTAINER( EXPORTING ROW = 1 COLUMN = 1 ).
DATA(LO_GUI_CONTAINER2) = GO_SPLITTER_CONTAINER->GET_CONTAINER( EXPORTING ROW = 1 COLUMN = 2 ).
DATA(LO_GUI_CONTAINER3) = GO_SPLITTER_CONTAINER->GET_CONTAINER( EXPORTING ROW = 1 COLUMN = 3 ).
PERFORM CREATE_SIMPLE_TREE USING LO_GUI_CONTAINER1.
PERFORM CREATE_COLUMN_TREE USING LO_GUI_CONTAINER2.
PERFORM CREATE_LIST_TREE USING LO_GUI_CONTAINER3.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CREATE_SIMPLE_TREE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM CREATE_SIMPLE_TREE USING LO_GUI_CONTAINER TYPE REF TO CL_GUI_CONTAINER.
CHECK GO_GUI_SIMPLE_TREE IS INITIAL.
DATA LCL_TREE_EVENT TYPE REF TO LCL_TREE_EVENT_RECEIVER.
"트리 오브젝트 생성
CREATE OBJECT GO_GUI_SIMPLE_TREE
EXPORTING
* LIFETIME =
PARENT = LO_GUI_CONTAINER "트리를 표시할 컨테이너
* SHELLSTYLE =
NODE_SELECTION_MODE = CL_GUI_SIMPLE_TREE=>NODE_SEL_MODE_SINGLE
* HIDE_SELECTION =
* NAME =
EXCEPTIONS
LIFETIME_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
FAILED = 4
ILLEGAL_NODE_SELECTION_MODE = 5
others = 6
.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
EXIT.
ENDIF.
"트리 이벤트 등록
GO_GUI_SIMPLE_TREE->SET_REGISTERED_EVENTS(
EXPORTING EVENTS = VALUE #( ( EVENTID = CL_GUI_SIMPLE_TREE=>EVENTID_NODE_DOUBLE_CLICK
APPL_EVENT = ' ' ) ) ). "APPL_EVENT : X = 애플리케이션 이벤트가 되므로 PBO 및 PAI가 호출됨
CREATE OBJECT LCL_TREE_EVENT EXPORTING I_TREE_OBJECT = GO_GUI_SIMPLE_TREE.
SET HANDLER LCL_TREE_EVENT->HANDLE_NODE_DOUBLE_CLICK FOR GO_GUI_SIMPLE_TREE.
"트리에 노드 추가
GO_GUI_SIMPLE_TREE->ADD_NODES(
EXPORTING
TABLE_STRUCTURE_NAME = 'MTREESNODE'
NODE_TABLE = GT_NODES
EXCEPTIONS
ERROR_IN_NODE_TABLE = 1
FAILED = 2
DP_ERROR = 3
TABLE_STRUCTURE_NAME_NOT_FOUND = 4
others = 5
).
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
EXIT.
ENDIF.
"루트 노드 펼치기
GO_GUI_SIMPLE_TREE->EXPAND_ROOT_NODES( EXPORTING LEVEL_COUNT = 1 ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CREATE_COLUMN_TREE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM CREATE_COLUMN_TREE USING LO_GUI_CONTAINER TYPE REF TO CL_GUI_CONTAINER.
CHECK GO_GUI_COLUMN_TREE IS INITIAL.
DATA LCL_TREE_EVENT TYPE REF TO LCL_TREE_EVENT_RECEIVER.
"Column tree의 hierarchy 컬럼 설정
GS_HIERARCHY_HEADER-HEADING = '헤더'.
GS_HIERARCHY_HEADER-WIDTH = 20.
GV_HIERARCHY_COLUMN_NAME = '1'.
"노드의 컬럼 선택 여부 (X 일 경우 ITEM_DOUBLE_CLICK 이벤트 사용 가능)
GV_ITEM_SELECTION = P_ITM_SE.
"트리 오브젝트 생성
CREATE OBJECT GO_GUI_COLUMN_TREE
EXPORTING
* LIFETIME =
PARENT = LO_GUI_CONTAINER "트리를 표시할 컨테이너
* SHELLSTYLE =
NODE_SELECTION_MODE = CL_GUI_COLUMN_TREE=>NODE_SEL_MODE_SINGLE
* HIDE_SELECTION =
ITEM_SELECTION = GV_ITEM_SELECTION
HIERARCHY_COLUMN_NAME = GV_HIERARCHY_COLUMN_NAME
HIERARCHY_HEADER = GS_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
.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
EXIT.
ENDIF.
"트리 이벤트 등록
DATA LT_EVENTS TYPE CNTL_SIMPLE_EVENTS.
LT_EVENTS = VALUE #( ( EVENTID = CL_GUI_COLUMN_TREE=>EVENTID_NODE_DOUBLE_CLICK APPL_EVENT = ' ' ) ). "APPL_EVENT : X = 애플리케이션 이벤트가 되므로 PBO 및 PAI가 호출됨
IF GV_ITEM_SELECTION IS NOT INITIAL.
APPEND VALUE #( EVENTID = CL_GUI_COLUMN_TREE=>EVENTID_ITEM_DOUBLE_CLICK APPL_EVENT = ' ' ) TO LT_EVENTS.
ENDIF.
GO_GUI_COLUMN_TREE->SET_REGISTERED_EVENTS( EXPORTING EVENTS = LT_EVENTS ).
CREATE OBJECT LCL_TREE_EVENT EXPORTING I_TREE_OBJECT = GO_GUI_COLUMN_TREE.
SET HANDLER LCL_TREE_EVENT->HANDLE_NODE_DOUBLE_CLICK FOR GO_GUI_COLUMN_TREE.
SET HANDLER LCL_TREE_EVENT->HANDLE_ITEM_DOUBLE_CLICK FOR GO_GUI_COLUMN_TREE.
"Hierarchy 외에 추가할 컬럼
GO_GUI_COLUMN_TREE->ADD_COLUMN(
EXPORTING
NAME = '2'
* HIDDEN =
* DISABLED =
* ALIGNMENT =
WIDTH = 20
* WIDTH_PIX =
* HEADER_IMAGE =
HEADER_TEXT = '내역'
* HEADER_TOOLTIP =
EXCEPTIONS
COLUMN_EXISTS = 1
ILLEGAL_COLUMN_NAME = 2
TOO_MANY_COLUMNS = 3
ILLEGAL_ALIGNMENT = 4
DIFFERENT_COLUMN_TYPES = 5
CNTL_SYSTEM_ERROR = 6
FAILED = 7
PREDECESSOR_COLUMN_NOT_FOUND = 8
others = 9
).
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
EXIT.
ENDIF.
GO_GUI_COLUMN_TREE->ADD_COLUMN(
EXPORTING
NAME = '3'
* HIDDEN =
* DISABLED =
* ALIGNMENT =
WIDTH = 30
* WIDTH_PIX =
* HEADER_IMAGE =
HEADER_TEXT = '추가정보'
* HEADER_TOOLTIP =
EXCEPTIONS
COLUMN_EXISTS = 1
ILLEGAL_COLUMN_NAME = 2
TOO_MANY_COLUMNS = 3
ILLEGAL_ALIGNMENT = 4
DIFFERENT_COLUMN_TYPES = 5
CNTL_SYSTEM_ERROR = 6
FAILED = 7
PREDECESSOR_COLUMN_NOT_FOUND = 8
others = 9
).
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
EXIT.
ENDIF.
"트리에 노드와 아이템(컬럼) 설정
DATA(LT_NODES) = CORRESPONDING TREEV_NTAB( GT_NODES ).
GO_GUI_COLUMN_TREE->ADD_NODES_AND_ITEMS(
EXPORTING
NODE_TABLE = LT_NODES
ITEM_TABLE = GT_ITEMS
ITEM_TABLE_STRUCTURE_NAME = 'MTREEITM'
EXCEPTIONS
FAILED = 1
CNTL_SYSTEM_ERROR = 2
ERROR_IN_TABLES = 3
DP_ERROR = 4
TABLE_STRUCTURE_NAME_NOT_FOUND = 5
others = 6
).
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
EXIT.
ENDIF.
"루트 노드 펼치기
GO_GUI_COLUMN_TREE->EXPAND_ROOT_NODES( EXPORTING LEVEL_COUNT = 1 ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CREATE_LIST_TREE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM CREATE_LIST_TREE USING LO_GUI_CONTAINER TYPE REF TO CL_GUI_CONTAINER.
CHECK GO_GUI_LIST_TREE IS INITIAL.
DATA LCL_TREE_EVENT TYPE REF TO LCL_TREE_EVENT_RECEIVER.
"트리의 hierarchy 컬럼 설정
GS_HIERARCHY_HEADER-HEADING = '헤더 영역'.
GS_HIERARCHY_HEADER-WIDTH = 20.
GS_LIST_HEADER-HEADING = '내역 영역'.
"노드의 컬럼 선택 여부 (X 일 경우 ITEM_DOUBLE_CLICK 이벤트 사용 가능)
GV_ITEM_SELECTION = P_ITM_SE.
"트리 오브젝트 생성
CREATE OBJECT GO_GUI_LIST_TREE
EXPORTING
* LIFETIME =
PARENT = LO_GUI_CONTAINER "트리를 표시할 컨테이너
* SHELLSTYLE =
NODE_SELECTION_MODE = CL_GUI_LIST_TREE=>NODE_SEL_MODE_SINGLE
* HIDE_SELECTION =
ITEM_SELECTION = GV_ITEM_SELECTION
WITH_HEADERS = 'X'
HIERARCHY_HEADER = GS_HIERARCHY_HEADER
LIST_HEADER = GS_LIST_HEADER
* NAME =
EXCEPTIONS
LIFETIME_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
ILLEGAL_NODE_SELECTION_MODE = 4
FAILED = 5
others = 6
.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
EXIT.
ENDIF.
"트리 이벤트 등록
DATA LT_EVENTS TYPE CNTL_SIMPLE_EVENTS.
LT_EVENTS = VALUE #( ( EVENTID = CL_GUI_LIST_TREE=>EVENTID_NODE_DOUBLE_CLICK APPL_EVENT = ' ' ) ). "APPL_EVENT : X = 애플리케이션 이벤트가 되므로 PBO 및 PAI가 호출됨
IF GV_ITEM_SELECTION IS NOT INITIAL.
APPEND VALUE #( EVENTID = CL_GUI_LIST_TREE=>EVENTID_ITEM_DOUBLE_CLICK APPL_EVENT = ' ' ) TO LT_EVENTS.
ENDIF.
GO_GUI_LIST_TREE->SET_REGISTERED_EVENTS( EXPORTING EVENTS = LT_EVENTS ).
CREATE OBJECT LCL_TREE_EVENT EXPORTING I_TREE_OBJECT = GO_GUI_LIST_TREE.
SET HANDLER LCL_TREE_EVENT->HANDLE_NODE_DOUBLE_CLICK FOR GO_GUI_LIST_TREE.
SET HANDLER LCL_TREE_EVENT->HANDLE_ITEM_DOUBLE_CLICK FOR GO_GUI_LIST_TREE.
"트리에 노드와 아이템(컬럼) 설정
DATA(LT_NODES) = CORRESPONDING TREEV_NTAB( GT_NODES ).
GO_GUI_LIST_TREE->ADD_NODES_AND_ITEMS(
EXPORTING
NODE_TABLE = LT_NODES
ITEM_TABLE = GT_ITEMS
ITEM_TABLE_STRUCTURE_NAME = 'MTREEITM'
EXCEPTIONS
FAILED = 1
CNTL_SYSTEM_ERROR = 2
ERROR_IN_TABLES = 3
DP_ERROR = 4
TABLE_STRUCTURE_NAME_NOT_FOUND = 5
others = 6
).
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
EXIT.
ENDIF.
"루트 노드 펼치기
GO_GUI_LIST_TREE->EXPAND_ROOT_NODES( EXPORTING LEVEL_COUNT = 1 ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
PERFORM CREATE_CONTAINER.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
IF SY-UCOMM(1) EQ 'E'.
LEAVE TO SCREEN 0.
ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form F4_SET_GROUP
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--P_P_SETNM text
*----------------------------------------------------------------------*
FORM F4_SET_GROUP CHANGING P_VALUE.
DATA: LT_DYNPFIELDS TYPE STANDARD TABLE OF DYNPREAD,
LV_KOKRS TYPE TKA01-KOKRS,
LV_CLASS TYPE SETHEADER-SETCLASS,
LV_SUBCLASS TYPE SETHEADER-SUBCLASS,
LV_FIELD_NAME TYPE RGSBS-FIELD,
LV_TABLE TYPE RGSBS-TABLE,
LV_SET_NAME TYPE SETHEADER-SETNAME.
LT_DYNPFIELDS = VALUE #( ( FIELDNAME = 'P_KOKRS' )
( FIELDNAME = 'P_CLASS' ) ).
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
DYNAME = SY-REPID
DYNUMB = SY-DYNNR
TABLES
DYNPFIELDS = LT_DYNPFIELDS
EXCEPTIONS
INVALID_ABAPWORKAREA = 1
INVALID_DYNPROFIELD = 2
INVALID_DYNPRONAME = 3
INVALID_DYNPRONUMMER = 4
INVALID_REQUEST = 5
NO_FIELDDESCRIPTION = 6
INVALID_PARAMETER = 7
UNDEFIND_ERROR = 8
DOUBLE_CONVERSION = 9
STEPL_NOT_FOUND = 10
OTHERS = 11
.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
LV_KOKRS = LT_DYNPFIELDS[ FIELDNAME = 'P_KOKRS' ]-FIELDVALUE.
LV_CLASS = LT_DYNPFIELDS[ FIELDNAME = 'P_CLASS' ]-FIELDVALUE.
SELECT SINGLE
KTOPL
FROM TKA01
WHERE KOKRS EQ @LV_KOKRS
INTO @DATA(LV_KTOPL).
LV_SUBCLASS = SWITCH #( P_CLASS WHEN '0102' THEN LV_KTOPL ELSE LV_KOKRS ).
CALL FUNCTION 'K_GROUP_SELECT'
EXPORTING
CLASS = LV_CLASS
FIELD_NAME = LV_FIELD_NAME
SET = '*'
TABLE = LV_TABLE
KOKRS = LV_KOKRS
KTOPL = LV_KTOPL
FIKRS = LV_KOKRS
IMPORTING
* CLASS_NAME = LV_CLASS_NAME
SET_NAME = LV_SET_NAME
* SET_TITLE = LV_SET_TITLE
* TABLE_NAME = LV_TABLE_NAME
* SETID = LV_SETID
EXCEPTIONS
NO_SET_PICKED = 1
OTHERS = 2
.
IF SY-SUBRC EQ 0.
P_VALUE = LV_SET_NAME.
ENDIF.
ENDFORM.
'ABAP > 개발Tip' 카테고리의 다른 글
[개발Tip] SYST 필드(SY-) 설명 (0) | 2023.10.30 |
---|---|
[개발Tip] SY-REPID 와 SY-CPROG 차이 (0) | 2023.10.30 |
[개발Tip] CL_GUI_LIST_TREE 사용 방법 (0) | 2023.10.16 |
[개발Tip] CL_GUI_COLUMN_TREE 사용 방법 (0) | 2023.10.16 |
[개발Tip] CL_GUI_SIMPLE_TREE 사용 방법 (0) | 2023.10.16 |
댓글