본문 바로가기
ABAP/개발Tip

[개발Tip] Simple, Column, List Tree 비교

by name_text 2023. 10. 16.

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.

댓글