在SE51設計界面裏,並沒有直觀的樹控件,只是一個容器,要實現樹功能還得在程序中用面向對象的方法實現。
本文就簡要介紹一下應用。
定義部分:
*內表部分
DATA:IT_TREE LIKE STANDARD TABLE OF ZOA_REG WITH HEADER LINE.
DATA IT_TREE1 LIKE IT_TREE.
FIELD-SYMBOLS <FS1> LIKE LINE OF IT_TREE.
* ----->TREE
CLASS LCL_APPLICATION DEFINITION DEFERRED.
CLASS CL_GUI_CFW DEFINITION LOAD.
TYPES: NODE_TABLE_TYPE LIKE STANDARD TABLE OF MTREESNODE
WITH DEFAULT KEY.
DATA:NODE_TABLE TYPE NODE_TABLE_TYPE .
* CAUTION: MTREESNODE IS THE NAME OF THE NODE STRUCTURE WHICH MUST
* BE DEFINED BY THE PROGRAMMER. DO NOT USE MTREESNODE!
DATA: G_APPLICATION TYPE REF TO LCL_APPLICATION,
G_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
G_TREE TYPE REF TO CL_GUI_SIMPLE_TREE.
DATA: G_EVENT(30),
G_NODE_KEY TYPE TV_NODEKEY.
*文本控件
DATA:USERNO(20),
USERNAME(20),
PASSWORD(20),
BRANCH(20),
UNIT(20),
MAIL(20),
TDATE(20),
SEX(20),
NOQUIT,
QUIT.
2、狀態及功能
*&---------------------------------------------------------------------*
*& MODULE STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* TEXT
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'PFSTATUS'.
SET TITLEBAR 'TITLE'.
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& MODULE USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* TEXT
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
CASE SY-UCOMM.
WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
LEAVE.
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
3、定義雙擊事件的定義和方法體:
*----------------------------------------------------------------------*
* CLASS LCL_APPLICATION DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
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. "LCL_APPLICATION DEFINITION
*----------------------------------------------------------------------*
* CLASS LCL_APPLICATION IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS LCL_APPLICATION IMPLEMENTATION.
METHOD HANDLE_NODE_DOUBLE_CLICK.
FIELD-SYMBOLS : <NODE> TYPE mtreesnode.
" THIS METHOD HANDLES THE NODE DOUBLE CLICK EVENT OF THE TREE
" CONTROL INSTANCE
READ TABLE NODE_TABLE ASSIGNING <NODE>
WITH KEY NODE_KEY = NODE_KEY .
IF NODE_KEY CS 'ZOA_REG'. "點擊父節點不做處理
MESSAGE <NODE>-TEXT TYPE 'I'.
ENDIF.
READ TABLE IT_TREE INTO IT_TREE1 WITH KEY USERNO = <NODE>-TEXT.
IF SY-SUBRC = 0.
USERNO = IT_TREE1-USERNO.
"USERNAME = IT_TREE1-NAME.
PASSWORD = IT_TREE1-PASS.
BRANCH = IT_TREE1-BRANCH.
UNIT = IT_TREE1-UNIT.
MAIL = IT_TREE1-MAIL.
TDATE = IT_TREE1-TDATE.
SEX = IT_TREE1-SEX.
IF IT_TREE1-STATE = '在職'.
NOQUIT = 'X'.
QUIT = ''.
ELSE.
NOQUIT = ''.
QUIT = 'X'.
ENDIF.
ELSE.
MESSAGE NODE_KEY TYPE 'I'.
ENDIF.
ENDMETHOD. "HANDLE_NODE_DOUBLE_CLICK
ENDCLASS. "LCL_APPLICATION IMPLEMENTATION
4、定義填充TREE控件的節點
*&---------------------------------------------------------------------*
*& FORM GET_PRO_ITEM
*&---------------------------------------------------------------------*
* TEXT
*----------------------------------------------------------------------*
* --> P1 TEXT
* <-- P2 TEXT
*----------------------------------------------------------------------*
FORM GET_PRO_ITEM .
PERFORM GET_DATA .
IF G_TREE IS INITIAL.
PERFORM CREATE_AND_INIT_TREE.
ENDIF.
ENDFORM. " GET_PRO_ITEM
*&---------------------------------------------------------------------*
*& FORM CREATE_AND_INIT_TREE
*&---------------------------------------------------------------------*
* 初始化樹
*----------------------------------------------------------------------*
* --> P1 TEXT
* <-- P2 TEXT
*----------------------------------------------------------------------*
FORM CREATE_AND_INIT_TREE .
DATA: EVENTS TYPE CNTL_SIMPLE_EVENTS,
EVENT TYPE CNTL_SIMPLE_EVENT.
* CREATE A CONTAINER FOR THE TREE CONTROL
CREATE OBJECT G_CUSTOM_CONTAINER
EXPORTING " THE CONTAINER IS LINKED TO THE CUSTOM CONTROL WITH THE
" NAME 'TREE_CONTAINER' ON THE DYNPRO
CONTAINER_NAME = 'THE_TREE' "填充到畫面上的容器裏
EXCEPTIONS
CNTL_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
LIFETIME_ERROR = 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
* CREATE A TREE CONTROL
CREATE OBJECT G_TREE
EXPORTING
PARENT = G_CUSTOM_CONTAINER
NODE_SELECTION_MODE = CL_GUI_SIMPLE_TREE=>NODE_SEL_MODE_SINGLE "單選模式
EXCEPTIONS
LIFETIME_ERROR = 1" SINGLE NODE SELECTIONIS USED
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
FAILED = 4
ILLEGAL_NODE_SELECTION_MODE = 5.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
* DEFINE THE EVENTS WHICH WILL BE PASSED TO THE BACKEND
" NODE DOUBLE CLICK
EVENT-EVENTID = CL_GUI_SIMPLE_TREE=>EVENTID_NODE_DOUBLE_CLICK. "定義雙擊事件
EVENT-APPL_EVENT = 'X'. " PROCESS PAI IF EVENT OCCURS
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.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
* ASSIGN EVENT HANDLERS IN THE APPLICATION CLASS TO EACH DESIRED EVENT
CREATE OBJECT G_APPLICATION.
SET HANDLER G_APPLICATION->HANDLE_NODE_DOUBLE_CLICK FOR G_TREE. "實現雙擊
PERFORM BUILD_NODE_TABLE USING NODE_TABLE. "填充樹的節點
CALL METHOD G_TREE->ADD_NODES
EXPORTING
TABLE_STRUCTURE_NAME = 'MTREESNODE'
NODE_TABLE = NODE_TABLE
EXCEPTIONS
FAILED = 1
ERROR_IN_NODE_TABLE = 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.
ENDIF.
*設置TREE CONTROL中的節點默認為展開狀態
CALL METHOD G_TREE->EXPAND_NODE
EXPORTING
NODE_KEY = G_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."...
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM. " CREATE_AND_INIT_TREE
*&---------------------------------------------------------------------*
*& FORM BUILD_NODE_TABLE
*&---------------------------------------------------------------------*
* TEXT
*----------------------------------------------------------------------*
* -->P_NODE_TABLE TEXT
*----------------------------------------------------------------------*
FORM BUILD_NODE_TABLE USING NODE_TABLE TYPE NODE_TABLE_TYPE.
DATA:NODE TYPE MTREESNODE.
DATA: L_INDEX LIKE SY-TABIX.
**設置父節點屬性
NODE-NODE_KEY = 'ZOA_REG'.
G_NODE_KEY = NODE-NODE_KEY.
CLEAR NODE-RELATKEY. " SPECIAL CASE: A ROOT NODE HAS NO PARENT
CLEAR NODE-RELATSHIP.
NODE-HIDDEN = ''. " THE NODE IS VISIBLE,
NODE-DISABLED = ''. " SELECTABLE,
NODE-ISFOLDER = 'X'. " A FOLDER.
* NODE-N_IMAGE = 'X'.
* NODE-EXP_IMAGE = 'X'.
NODE-STYLE = CL_GUI_SIMPLE_TREE=>STYLE_DEFAULT.
* NODE-NO_BRANCH = 'X'.
* NODE-EXPANDER = 'X'.
* NODE-DRAGDROPID
NODE-TEXT = '員工工號如下'.
APPEND NODE TO NODE_TABLE.
**設置子節點屬性
SORT IT_TREE BY USERNO.
L_INDEX = 0.
LOOP AT IT_TREE ASSIGNING <FS1>.
CLEAR: NODE-N_IMAGE.
L_INDEX = L_INDEX + 1.
NODE-NODE_KEY = L_INDEX .
NODE-RELATKEY = 'ZOA_REG'.
NODE-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
NODE-HIDDEN = ''. " THE NODE IS VISIBLE,
NODE-DISABLED = ''.
NODE-ISFOLDER = ' '. " 'X' 表示可摺疊;'':表示不可摺疊
NODE-TEXT = <FS1>-USERNO.
APPEND NODE TO NODE_TABLE.
ENDLOOP.
ENDFORM. " BUILD_NODE_TABLE
*&---------------------------------------------------------------------*
*& FORM GET_DATA
*&---------------------------------------------------------------------*
* TEXT
*----------------------------------------------------------------------*
* -->P_R_DATE TEXT
*----------------------------------------------------------------------*
FORM GET_DATA .
CLEAR : IT_TREE[].
SELECT * FROM ZOA_REG
INTO CORRESPONDING FIELDS OF TABLE IT_TREE WHERE WERKS = '1201'.
IF IT_TREE[] IS NOT INITIAL.
ELSE.
MESSAGE 'ERROR' TYPE 'E'.
ENDIF.
ENDFORM. " GET_DATA
5、畫面SE51中設置如下圖:
6、數據表如下:
7、運行結果:
至此,樹控件設置結束。