您的位置:首页 > 其它

ABAP Tree Control的使用

2016-07-04 18:39 465 查看
Tree Control是最常用的Windows控件之一,在其他语言中,称为“Tree View”等,ABAP的Tree Control能完成相似的功能,本章主要介绍以下实例:

(1)实现一个简单的Tree Control;

(2)建立有数据表接口的Tree Control对象;

(3)通过右键菜单完成Tree Control节点的增删修改等功能;

(4)Tree Control对象与ALV Grid对象关联,实现在双击Tree节点时,变更ALV Grid的显示。

1、简单的Tree Control实例

本例将实现以下功能:

(1)建立一个以国家、城市、城区三层的Tree Control对象(固定数据);
(2)当双击某个节点时,在文本框显示选中节点的KEY值和文本值。



实现步骤如下(前两步为基本功能,不再详细描述):

(1)建立一个ABAP程序;

(2)使用屏幕制作器,建立 Screen。

A、添加“定制控制”对象;

B、添加两个文本框,存放节点KEY值和节点文本值。

(3)建立程序

A、处理窗口调用,退出等基本功能;

B、创建窗口定制对象,Tree Control对象,测试运行时能看到TREE区域

C、实现Tree节点的创建,测试运行,能看到Tree的所有节点;

D、定义对象,建立双击方法,并将双击方法分配Tree对象,实现双击事件。
建立好的屏幕和对象界面如图:



元素清单如图:



逻辑流程序:

PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
*
PROCESS AFTER INPUT.
MODULE USER_COMMAND_0100.
主程序:

REPORT  Z_TREETEST_20160629001.
*功能码返回值
DATA: OK_CODE TYPE SY-UCOMM,
SAVE_OK TYPE SY-UCOMM.
*定制对象
DATA: WA_CONTAINER TYPE SCRFNAME VALUE 'TREE',
*客户对象
WA_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
WA_TREE TYPE REF TO CL_GUI_SIMPLE_TREE.
*NODE节点表
DATA: NODE_TABLE LIKE TABLE OF MTREESNODE,
*节点
NODE1 TYPE MTREESNODE.
*定义内表,变量需要传递,不加HEADER LINE
DATA WA_SPFLI TYPE TABLE OF SPFLI.
*当双击时取得节点KEY值与节点文本值变量
DATA: NODEKEY(200) VALUE 'NODE', NODETEXT(200) VALUE 'NODE'.
*定义对象,定义对象的双击方法,用于将该对象双击方法分配到树双击事件
CLASS LCL_APPLICATION DEFINITION DEFERRED.

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.
NODEKEY = NODE_KEY.
READ TABLE NODE_TABLE WITH KEY NODE_KEY = NODE_KEY INTO NODE1.
NODETEXT = NODE1-TEXT.
ENDMETHOD.
ENDCLASS.

*自定义对象实例
DATA: G_APPLICATION TYPE REF TO LCL_APPLICATION.
START-OF-SELECTION.
CREATE OBJECT G_APPLICATION.
CALL SCREEN 100.

MODULE STATUS_0100 OUTPUT.
IF WA_CUSTOM_CONTAINER IS INITIAL.
PERFORM CREATE_TREE.
ENDIF.
ENDMODULE.

MODULE USER_COMMAND_0100 INPUT.
SAVE_OK = OK_CODE.
CLEAR OK_CODE.
CASE SAVE_OK.
WHEN 'CANCEL'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE.

FORM CREATE_TREE.
*事件内表及单个事件对象.
DATA: EVENTS TYPE CNTL_SIMPLE_EVENTS,
EVENT1 TYPE CNTL_SIMPLE_EVENT.
*建立定制控制对象
CREATE OBJECT WA_CUSTOM_CONTAINER
EXPORTING
CONTAINER_NAME = WA_CONTAINER.
*建立树对象
CREATE OBJECT WA_TREE
EXPORTING
PARENT = WA_CUSTOM_CONTAINER
NODE_SELECTION_MODE = CL_GUI_SIMPLE_TREE=>NODE_SEL_MODE_SINGLE.

IF SY-SUBRC <> 0.
ENDIF.
*开始建立以国家->城市->城区 三层的树
CLEAR NODE1.
*节点关键字
NODE1-NODE_KEY = 'CHINA'.
*第一层
CLEAR NODE1-RELATKEY.
CLEAR NODE1-RELATSHIP.
*是文件夹
NODE1-HIDDEN = ''.
NODE1-DISABLED = ''.
NODE1-ISFOLDER = 'X'.
*不带ICON
CLEAR NODE1-N_IMAGE.
CLEAR NODE1-EXP_IMAGE.
CLEAR NODE1-EXPANDER.

NODE1-TEXT = '中国'.
APPEND NODE1 TO NODE_TABLE.

*二层节点
CLEAR NODE1.
NODE1-NODE_KEY = 'BJ'.
*上层关系
NODE1-RELATKEY = 'CHINA'.
NODE1-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
NODE1-HIDDEN = ''.
NODE1-DISABLED = ''.
NODE1-ISFOLDER = 'X'.
CLEAR NODE1-N_IMAGE.
CLEAR NODE1-EXP_IMAGE.
CLEAR NODE1-EXPANDER.
NODE1-TEXT = '北京'.
APPEND NODE1 TO NODE_TABLE.

CLEAR NODE1.
NODE1-NODE_KEY = 'SH'.
NODE1-RELATKEY = 'CHINA'.
NODE1-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
NODE1-HIDDEN = ''.
NODE1-DISABLED = ''.
NODE1-ISFOLDER = 'X'.
CLEAR NODE1-N_IMAGE.
CLEAR NODE1-EXP_IMAGE.
CLEAR NODE1-EXPANDER.
NODE1-TEXT = '上海'.
APPEND NODE1 TO NODE_TABLE.

*三层节点
CLEAR NODE1.
NODE1-NODE_KEY = 'CWQ'.
NODE1-RELATKEY = 'BJ'.
NODE1-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
NODE1-HIDDEN = ''.
NODE1-DISABLED = ''.
NODE1-ISFOLDER = ''.
*图标,可运行SHOWICON查阅
NODE1-N_IMAGE = '@9Y@'.
NODE1-EXP_IMAGE = '@9Y@'.
CLEAR NODE1-EXPANDER.
NODE1-TEXT = '崇文区'.
APPEND NODE1 TO NODE_TABLE.

CLEAR NODE1.
NODE1-NODE_KEY = 'XCQ'.
NODE1-RELATKEY = 'BJ'.
NODE1-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
NODE1-HIDDEN = ''.
NODE1-DISABLED = ''.
NODE1-ISFOLDER = ''.
NODE1-N_IMAGE = '@DF@'.
NODE1-EXP_IMAGE = '@DF@'.
CLEAR NODE1-EXPANDER.
NODE1-TEXT = '西城区'.
APPEND NODE1 TO NODE_TABLE.

CLEAR NODE1.
NODE1-NODE_KEY = 'MXQ'.
NODE1-RELATKEY = 'SH'.
NODE1-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
NODE1-HIDDEN = ''.
NODE1-DISABLED = ''.
NODE1-ISFOLDER = ''.
NODE1-N_IMAGE = '@NL@'.
NODE1-EXP_IMAGE = '@NL@'.
CLEAR NODE1-EXPANDER.
NODE1-TEXT = '闵行区'.
APPEND NODE1 TO NODE_TABLE.

*按照节点内容添加节点
CALL METHOD WA_TREE->ADD_NODES
EXPORTING
TABLE_STRUCTURE_NAME = 'MTREESNODE'
NODE_TABLE = NODE_TABLE.

IF SY-SUBRC <> 0.
ENDIF.

*定义双击事件
EVENT1-EVENTID = CL_GUI_SIMPLE_TREE=>EVENTID_NODE_DOUBLE_CLICK.
EVENT1-APPL_EVENT = 'X'.
APPEND EVENT1 TO EVENTS.
*添加事件内表
CALL METHOD WA_TREE->SET_REGISTERED_EVENTS
EXPORTING
EVENTS = EVENTS.

IF SY-SUBRC <> 0.
ENDIF.

*将已定义的双击事件分配至树对象
SET HANDLER G_APPLICATION->HANDLE_NODE_DOUBLE_CLICK FOR WA_TREE.
ENDFORM.


2、建立有数据表接口的Tree Control对象

先从数据表读取结构,并按照数据关系建立Tree Control,如图



以航班表为例,以“起飞国家-->航班承运人-->航班连接”三层组成。

建立好的屏幕和对象界面如图:



元素清单如图:



逻辑流程序:

PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
*
PROCESS AFTER INPUT.
MODULE USER_COMMAND_0100.
主程序:

REPORT  Z_TREETEST_20160629002.
DATA: OK_CODE TYPE SY-UCOMM,
SAVE_OK TYPE SY-UCOMM.
*定制对象
DATA: WA_CONTAINER TYPE SCRFNAME VALUE 'TREE',
*客户对象
WA_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
WA_TREE TYPE REF TO CL_GUI_SIMPLE_TREE.
*NODE节点表
DATA: NODE_TABLE LIKE TABLE OF MTREESNODE,
*节点
NODE1 TYPE MTREESNODE.

DATA WA_SPFLI TYPE TABLE OF SPFLI WITH HEADER LINE.

START-OF-SELECTION.
SELECT * INTO TABLE WA_SPFLI FROM SPFLI
ORDER BY COUNTRYFR CARRID CONNID ASCENDING.

SET SCREEN 100.

MODULE STATUS_0100 OUTPUT.
IF WA_CUSTOM_CONTAINER IS INITIAL.
PERFORM CREATE_TREE.
ENDIF.
ENDMODULE.

MODULE USER_COMMAND_0100 INPUT.
SAVE_OK = OK_CODE.
CLEAR OK_CODE.
CASE SAVE_OK.
WHEN 'CANCEL'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE.

FORM CREATE_TREE.
*建立定制控制对象
CREATE OBJECT WA_CUSTOM_CONTAINER
EXPORTING
CONTAINER_NAME = WA_CONTAINER.
*建立树对象
CREATE OBJECT WA_TREE
EXPORTING
PARENT = WA_CUSTOM_CONTAINER
NODE_SELECTION_MODE = CL_GUI_SIMPLE_TREE=>NODE_SEL_MODE_SINGLE.

IF SY-SUBRC <> 0.
ENDIF.

DATA: COUNTRYFR LIKE SPFLI-COUNTRYFR,
CARRID LIKE SPFLI-CARRID.

DATA:STR1(255).

LOOP AT WA_SPFLI.
IF COUNTRYFR NE WA_SPFLI-COUNTRYFR.
CLEAR NODE1.
NODE1-NODE_KEY = WA_SPFLI-COUNTRYFR.
*第一层
CLEAR NODE1-RELATKEY.
CLEAR NODE1-RELATSHIP.
*是文件夹
NODE1-HIDDEN = ''.
NODE1-DISABLED = ''.
NODE1-ISFOLDER = 'X'.
*不带ICON
CLEAR NODE1-N_IMAGE.
CLEAR NODE1-EXP_IMAGE.
CLEAR NODE1-EXPANDER.

NODE1-TEXT = WA_SPFLI-COUNTRYFR.
APPEND NODE1 TO NODE_TABLE.
ENDIF.

IF ( COUNTRYFR NE WA_SPFLI-COUNTRYFR ) OR ( CARRID <> WA_SPFLI-CARRID ).
CLEAR NODE1.
CONCATENATE WA_SPFLI-COUNTRYFR WA_SPFLI-CARRID INTO NODE1-NODE_KEY.
*上层关系
NODE1-RELATKEY = WA_SPFLI-COUNTRYFR.
NODE1-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
NODE1-HIDDEN = ''.
NODE1-DISABLED = ''.
NODE1-ISFOLDER = 'X'.
CLEAR NODE1-N_IMAGE.
CLEAR NODE1-EXP_IMAGE.
CLEAR NODE1-EXPANDER.
*节点显示CARRID
NODE1-TEXT = WA_SPFLI-CARRID.
APPEND NODE1 TO NODE_TABLE.
ENDIF.

COUNTRYFR = WA_SPFLI-COUNTRYFR.
CARRID = WA_SPFLI-CARRID.
CLEAR NODE1.
CONCATENATE WA_SPFLI-COUNTRYFR WA_SPFLI-CARRID
WA_SPFLI-CONNID INTO NODE1-NODE_KEY.

CONCATENATE WA_SPFLI-COUNTRYFR WA_SPFLI-CARRID INTO STR1.
NODE1-RELATKEY = STR1.
NODE1-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
NODE1-HIDDEN = ''.
NODE1-DISABLED = ''.
NODE1-ISFOLDER = 'X'.
NODE1-N_IMAGE = '@5B@'.
NODE1-EXP_IMAGE = '@5B@'.
CLEAR NODE1-EXPANDER.
CONCATENATE WA_SPFLI-CARRID ':' WA_SPFLI-CITYFROM INTO STR1.
NODE1-TEXT = STR1.
APPEND NODE1 TO NODE_TABLE.
ENDLOOP.

*按照节点内容添加节点
CALL METHOD WA_TREE->ADD_NODES
EXPORTING
TABLE_STRUCTURE_NAME = 'MTREESNODE'
NODE_TABLE = NODE_TABLE.
IF SY-SUBRC <> 0.
ENDIF.
ENDFORM.


3、通过右键菜单完成Tree Control节点的增删改功能

Tree节点的增删改是很重要的功能,包括:增加本级节点,增加子节点,修改节点,删除节点。完成后效果如下:
选择根节点,单击右键,弹出右键菜单,如选择“北京”节点,选择“增加本级节点”菜单,如图



在单击文本输入“广州”后,单击“更新”按钮,如图



Tree对象增加了“广州”节点,选择该节点,选右键菜单中“增加子节点”菜单,如图



输入”天河区“,单击”更新“按钮,如图



增加节点后,输出结果如图



除上术功能外,还有修改及删除节点等功能
建立好的屏幕和对象界面如图:



元素清单如图:



逻辑流程序:

PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
*
PROCESS AFTER INPUT.
MODULE USER_COMMAND_0100.


主程序:

REPORT  z_treetest_20160630001.
DATA: ok_code TYPE sy-ucomm,
save_ok TYPE sy-ucomm.

DATA: wa_container TYPE scrfname VALUE 'TREE',
wa_custom_container TYPE REF TO cl_gui_custom_container,
wa_tree TYPE REF TO cl_gui_simple_tree.

DATA: node_table LIKE TABLE OF mtreesnode,
anode_table LIKE TABLE OF mtreesnode,
node1 TYPE mtreesnode,
node2 TYPE mtreesnode.

DATA wa_spfli TYPE TABLE OF spfli.

DATA: nodekey(200) VALUE 'NODE',
nodetext(200) VALUE 'NODE',
nodekeyold(200) VALUE 'NODE',
getkey(200).

DATA menustr(10) VALUE ''.

CLASS lcl_application DEFINITION DEFERRED.

*----------------------------------------------------------------------*
*       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.

METHODS:
handle_node_context_menu_req
FOR EVENT node_context_menu_request
OF cl_gui_simple_tree
IMPORTING node_key menu.

METHODS:
handle_node_context_menu_sel
FOR EVENT node_context_menu_select
OF cl_gui_simple_tree
IMPORTING node_key fcode.
ENDCLASS.                    "LCL_APPLICATION DEFINITION

*----------------------------------------------------------------------*
*       CLASS LCL_APPLICATION IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_application IMPLEMENTATION.
METHOD handle_node_double_click.
nodekey = node_key.
READ TABLE node_table WITH KEY node_key = node_key INTO node1.
nodetext = node1-text.
ENDMETHOD.                    "HANDLE_NODE_DOUBLE_CLICK

METHOD handle_node_context_menu_req.
CALL METHOD menu->add_function
EXPORTING
text  = '增加本级节点'
fcode = 'CODE1'.

CALL METHOD menu->add_function
EXPORTING
text  = '增加子节点'
fcode = 'CODE2'.

CALL METHOD menu->add_function
EXPORTING
text  = '修改当前节点'
fcode = 'CODE3'.
CALL METHOD menu->add_function
EXPORTING
text  = '删除当前节点'
fcode = 'CODE4'.
ENDMETHOD.                    "HANDLE_NODE_CONTEXT_MENU_REQ

METHOD handle_node_context_menu_sel.
DATA str1 TYPE tv_nodekey.
CALL METHOD wa_tree->get_selected_node
IMPORTING
node_key = str1.
IF sy-subrc = 0.
menustr = fcode.
nodekey = str1.
nodekeyold = str1.

READ TABLE node_table WITH KEY node_key = nodekey INTO node1.
nodetext = node1-text.
IF fcode = 'CODE4'.
CALL METHOD wa_tree->delete_node
EXPORTING
node_key = node1-node_key.
DELETE node_table WHERE node_key = nodekey.
ENDIF.
ENDIF.
ENDMETHOD.                    "HANDLE_NODE_CONTEXT_MENU_SEL
ENDCLASS.                    "LCL_APPLICATION IMPLEMENTATION

DATA: g_application TYPE REF TO lcl_application.

START-OF-SELECTION.
CALL SCREEN 100.

*----------------------------------------------------------------------*
*  MODULE STATUS_0100 OUTPUT
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
IF wa_custom_container IS INITIAL.
CREATE OBJECT g_application.
PERFORM create_tree.
ENDIF.
ENDMODULE.                    "STATUS_0100 OUTPUT

*----------------------------------------------------------------------*
*  MODULE USER_COMMAND_0100 INPUT
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
DATA str1 TYPE tv_nodekey.
save_ok = ok_code.
CLEAR ok_code.

CASE save_ok.
WHEN 'CANCEL'.
LEAVE PROGRAM.
WHEN 'GETKEY'.
CALL METHOD wa_tree->get_selected_node
IMPORTING
node_key = str1.

IF sy-subrc EQ 0.
getkey = str1.
ENDIF.

WHEN 'UPDATE'.
IF ( menustr = 'CODE1' ) OR ( menustr = 'CODE2').
READ TABLE node_table
WITH KEY node_key = nodekey INTO node1.
IF sy-subrc EQ 0.
MESSAGE e208(00) WITH '键值重复!'.
ENDIF.
ENDIF.

CASE menustr.
WHEN 'CODE1'.
READ TABLE node_table WITH KEY node_key = nodekeyold INTO node2.

CLEAR node1.
node1-node_key = nodekey.
node1-relatkey = node2-relatkey.
node1-relatship = cl_gui_simple_tree=>relat_last_child.
node1-hidden = ''.
node1-disabled = ''.
node1-isfolder = 'X'.
node1-n_image = '@G3@'.
node1-exp_image = '@G3@'.
CLEAR node1-expander.
node1-text = nodetext.
APPEND node1 TO node_table.
CLEAR anode_table.
APPEND node1 TO anode_table.

CALL METHOD wa_tree->add_nodes
EXPORTING
table_structure_name = 'MTREESNODE'
node_table           = anode_table.
IF sy-subrc <> 0.
ENDIF.

WHEN 'CODE2'.
CLEAR node1.
node1-node_key = nodekey.
node1-relatkey = nodekeyold.
node1-relatship = cl_gui_simple_tree=>relat_last_child.
node1-hidden = ''.
node1-disabled = ''.
node1-isfolder = 'X'.
node1-n_image = '@G3@'.
node1-exp_image = '@G3@'.
CLEAR node1-expander.
node1-text = nodetext.
APPEND node1 TO node_table.
CLEAR anode_table.
APPEND node1 TO anode_table.

CALL METHOD wa_tree->add_nodes
EXPORTING
table_structure_name = 'MTREESNODE'
node_table           = anode_table.
IF sy-subrc <> 0.
ENDIF.

WHEN 'CODE3'.
node1-node_key = nodekeyold.
CALL METHOD wa_tree->node_set_text
EXPORTING
node_key = node1-node_key
text     = nodetext.
IF sy-subrc <> 0.
ENDIF.

ENDCASE.
ENDCASE.
ENDMODULE.                    "USER_COMMAND_0100 INPUT

*&---------------------------------------------------------------------*
*&      Form  CREATE_TREE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM create_tree.
*事件内表及单个事件对象.
DATA: events TYPE cntl_simple_events,
event1 TYPE cntl_simple_event.
*建立定制控制对象
CREATE OBJECT wa_custom_container
EXPORTING
container_name = wa_container.
*建立树对象
CREATE OBJECT wa_tree
EXPORTING
parent              = wa_custom_container
node_selection_mode = cl_gui_simple_tree=>node_sel_mode_single.

IF sy-subrc <> 0.
ENDIF.
*开始建立以国家->城市->城区 三层的树
CLEAR node1.
*节点关键字
node1-node_key = 'CHINA'.
*第一层
CLEAR node1-relatkey.
CLEAR node1-relatship.
*是文件夹
node1-hidden = ''.
node1-disabled = ''.
node1-isfolder = 'X'.
*不带ICON
CLEAR node1-n_image.
CLEAR node1-exp_image.
CLEAR node1-expander.

node1-text = '中国'.
APPEND node1 TO node_table.

*二层节点
CLEAR node1.
node1-node_key = 'BJ'.
*上层关系
node1-relatkey = 'CHINA'.
node1-relatship = cl_gui_simple_tree=>relat_last_child.
node1-hidden = ''.
node1-disabled = ''.
node1-isfolder = 'X'.
CLEAR node1-n_image.
CLEAR node1-exp_image.
CLEAR node1-expander.
node1-text = '北京'.
APPEND node1 TO node_table.

CLEAR node1.
node1-node_key = 'SH'.
node1-relatkey = 'CHINA'.
node1-relatship = cl_gui_simple_tree=>relat_last_child.
node1-hidden = ''.
node1-disabled = ''.
node1-isfolder = 'X'.
CLEAR node1-n_image.
CLEAR node1-exp_image.
CLEAR node1-expander.
node1-text = '上海'.
APPEND node1 TO node_table.

*三层节点
CLEAR node1.
node1-node_key = 'CWQ'.
node1-relatkey = 'BJ'.
node1-relatship = cl_gui_simple_tree=>relat_last_child.
node1-hidden = ''.
node1-disabled = ''.
node1-isfolder = ''.
*图标,可运行SHOWICON查阅
node1-n_image = '@9Y@'.
node1-exp_image = '@9Y@'.
CLEAR node1-expander.
node1-text = '崇文区'.
APPEND node1 TO node_table.

CLEAR node1.
node1-node_key = 'XCQ'.
node1-relatkey = 'BJ'.
node1-relatship = cl_gui_simple_tree=>relat_last_child.
node1-hidden = ''.
node1-disabled = ''.
node1-isfolder = ''.
node1-n_image = '@DF@'.
node1-exp_image = '@DF@'.
CLEAR node1-expander.
node1-text = '西城区'.
APPEND node1 TO node_table.

CLEAR node1.
node1-node_key = 'MXQ'.
node1-relatkey = 'SH'.
node1-relatship = cl_gui_simple_tree=>relat_last_child.
node1-hidden = ''.
node1-disabled = ''.
node1-isfolder = ''.
node1-n_image = '@NL@'.
node1-exp_image = '@NL@'.
CLEAR node1-expander.
node1-text = '闵行区'.
APPEND node1 TO node_table.

*按照节点内容添加节点
CALL METHOD wa_tree->add_nodes
EXPORTING
table_structure_name = 'MTREESNODE'
node_table           = node_table.

IF sy-subrc <> 0.
ENDIF.

*定义双击事件
event1-eventid = cl_gui_simple_tree=>eventid_node_double_click.
event1-appl_event = 'X'.
APPEND event1 TO events.
*添加事件内表
CALL METHOD wa_tree->set_registered_events
EXPORTING
events = events.

IF sy-subrc <> 0.
ENDIF.

CALL METHOD wa_tree->expand_node
EXPORTING
node_key            = 'CHINA'
expand_subtree      = 'X'
EXCEPTIONS
failed              = 1
illegal_level_count = 2
cntl_system_error   = 3
node_not_found      = 4
cannot_expand_leaf  = 5.

IF sy-subrc NE 0.
ENDIF.

*定义双击事件
event1-eventid = cl_gui_simple_tree=>eventid_node_double_click.
event1-appl_event = 'X'.
APPEND event1 TO events.

event1-eventid = cl_gui_simple_tree=>eventid_node_context_menu_req.
event1-appl_event = ''.
APPEND event1 TO events.

CALL METHOD wa_tree->set_ctx_menu_select_event_appl
EXPORTING
appl_event = 'X'.

*添加事件内表
CALL METHOD wa_tree->set_registered_events
EXPORTING
events = events.

*将已定义的双击事件分配至树对象
SET HANDLER g_application->handle_node_double_click FOR wa_tree.

SET HANDLER g_application->handle_node_context_menu_req FOR wa_tree.

SET HANDLER g_application->handle_node_context_menu_sel FOR wa_tree.

ENDFORM.                    "CREATE_TREE


4、Tree Control对象与ALV Grid对象关联

在双击Tree对象时,变更ALV Grid对象的显示,实现界面如图



建立好的屏幕和对象界面如图:



元素清单如图:



逻辑流程序:

PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
*
PROCESS AFTER INPUT.
MODULE USER_COMMAND_0100.
主程序:

REPORT  Z_TREETEST_20160630002.
DATA: OK_CODE TYPE SY-UCOMM,
SAVE_OK TYPE SY-UCOMM.

DATA: WA_CONTAINER TYPE SCRFNAME VALUE 'TREE',
WA_CONTAINERALV TYPE SCRFNAME VALUE 'ALV',
WA_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
WA_CUSTOM_CONTAINERALV TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
WA_TREE TYPE REF TO CL_GUI_SIMPLE_TREE,
WA_ALV TYPE REF TO CL_GUI_ALV_GRID.

DATA: NODE_TABLE LIKE TABLE OF MTREESNODE,
NODE1 TYPE MTREESNODE.

DATA WA_SPFLI TYPE TABLE OF SPFLI WITH HEADER LINE.
DATA WA_SFLIGHT TYPE TABLE OF SFLIGHT.

DATA: NODEKEY(200) VALUE 'NODE',
NODETEXT(200) VALUE 'NODE'.

CLASS LCL_APPLICATION DEFINITION DEFERRED.
DATA EVENT_RECEIVER TYPE REF TO LCL_APPLICATION.

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.
NODEKEY = NODE_KEY.
READ TABLE NODE_TABLE WITH KEY NODE_KEY = NODE_KEY INTO NODE1.
NODETEXT = NODE1-TEXT.

CLEAR WA_SFLIGHT.
SELECT * INTO TABLE WA_SFLIGHT FROM SFLIGHT
WHERE CARRID = NODE1-NODE_KEY+2(2)
AND CONNID = NODE1-NODE_KEY+4(4).

CALL METHOD WA_ALV->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
I_STRUCTURE_NAME = 'SFLIGHT'
CHANGING
IT_OUTTAB = WA_SFLIGHT.
ENDMETHOD.
ENDCLASS.

DATA G_APPLICATION TYPE REF TO LCL_APPLICATION.

START-OF-SELECTION.
SELECT * INTO TABLE WA_SPFLI FROM SPFLI
ORDER BY COUNTRYFR CARRID ASCENDING.

CREATE OBJECT G_APPLICATION.
SET SCREEN 100.

MODULE STATUS_0100 OUTPUT.
IF WA_CUSTOM_CONTAINER IS INITIAL.
PERFORM CREATE_TREE.
ENDIF.
ENDMODULE.

MODULE USER_COMMAND_0100 INPUT.
SAVE_OK = OK_CODE.
CLEAR OK_CODE.
CASE SAVE_OK.
WHEN 'CANCEL'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE.

FORM CREATE_TREE.
DATA: EVENTS TYPE CNTL_SIMPLE_EVENTS,
EVENT1 TYPE CNTL_SIMPLE_EVENT.

*建立定制控制对象
CREATE OBJECT WA_CUSTOM_CONTAINER
EXPORTING
CONTAINER_NAME = WA_CONTAINER.

*创建ALV对象
CREATE OBJECT WA_CUSTOM_CONTAINERALV
EXPORTING
CONTAINER_NAME = WA_CONTAINERALV.

CREATE OBJECT WA_ALV
EXPORTING
I_PARENT = WA_CUSTOM_CONTAINERALV.

*建立树对象
CREATE OBJECT WA_TREE
EXPORTING
PARENT = WA_CUSTOM_CONTAINER
NODE_SELECTION_MODE = CL_GUI_SIMPLE_TREE=>NODE_SEL_MODE_SINGLE.

IF SY-SUBRC <> 0.
ENDIF.

DATA: COUNTRYFR LIKE SPFLI-COUNTRYFR,
CARRID LIKE SPFLI-CARRID.

DATA:STR1(255).

LOOP AT WA_SPFLI.
IF COUNTRYFR NE WA_SPFLI-COUNTRYFR.
CLEAR NODE1.
NODE1-NODE_KEY = WA_SPFLI-COUNTRYFR.
*第一层
CLEAR NODE1-RELATKEY.
CLEAR NODE1-RELATSHIP.
*是文件夹
NODE1-HIDDEN = ''.
NODE1-DISABLED = ''.
NODE1-ISFOLDER = 'X'.
*不带ICON
CLEAR NODE1-N_IMAGE.
CLEAR NODE1-EXP_IMAGE.
CLEAR NODE1-EXPANDER.

NODE1-TEXT = WA_SPFLI-COUNTRYFR.
APPEND NODE1 TO NODE_TABLE.
ENDIF.

IF ( COUNTRYFR NE WA_SPFLI-COUNTRYFR ) OR ( CARRID <> WA_SPFLI-CARRID ).
CLEAR NODE1.
CONCATENATE WA_SPFLI-COUNTRYFR WA_SPFLI-CARRID INTO NODE1-NODE_KEY.
*上层关系
NODE1-RELATKEY = WA_SPFLI-COUNTRYFR.
NODE1-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
NODE1-HIDDEN = ''.
NODE1-DISABLED = ''.
NODE1-ISFOLDER = 'X'.
CLEAR NODE1-N_IMAGE.
CLEAR NODE1-EXP_IMAGE.
CLEAR NODE1-EXPANDER.
*节点显示CARRID
NODE1-TEXT = WA_SPFLI-CARRID.
APPEND NODE1 TO NODE_TABLE.
ENDIF.

COUNTRYFR = WA_SPFLI-COUNTRYFR.
CARRID = WA_SPFLI-CARRID.
CLEAR NODE1.
CONCATENATE WA_SPFLI-COUNTRYFR WA_SPFLI-CARRID
WA_SPFLI-CONNID INTO NODE1-NODE_KEY.

CONCATENATE WA_SPFLI-COUNTRYFR WA_SPFLI-CARRID INTO STR1.
NODE1-RELATKEY = STR1.
NODE1-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
NODE1-HIDDEN = ''.
NODE1-DISABLED = ''.
NODE1-ISFOLDER = 'X'.
NODE1-N_IMAGE = '@5B@'.
NODE1-EXP_IMAGE = '@5B@'.
CLEAR NODE1-EXPANDER.
CONCATENATE WA_SPFLI-CARRID ':' WA_SPFLI-CITYFROM INTO STR1.
NODE1-TEXT = STR1.
APPEND NODE1 TO NODE_TABLE.
ENDLOOP.

*按照节点内容添加节点
CALL METHOD WA_TREE->ADD_NODES
EXPORTING
TABLE_STRUCTURE_NAME = 'MTREESNODE'
NODE_TABLE = NODE_TABLE.
IF SY-SUBRC <> 0.
ENDIF.

*定义双击事件
EVENT1-EVENTID = CL_GUI_SIMPLE_TREE=>EVENTID_NODE_DOUBLE_CLICK.
EVENT1-APPL_EVENT = 'X'.
APPEND EVENT1 TO EVENTS.

CALL METHOD WA_TREE->SET_REGISTERED_EVENTS
EXPORTING
EVENTS = EVENTS.

IF SY-SUBRC <> 0.
ENDIF.

*将已定义的双击事件分配至树对象
SET HANDLER G_APPLICATION->HANDLE_NODE_DOUBLE_CLICK FOR WA_TREE.
ENDFORM.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sap abap tree control