ABAP 树型菜单程序Jerry 项目中树型菜单很少用到,但是学会了,也是一种好事。
最近,客户方就有一个要求,能够实现特殊的文档管理,包括动态的树型菜单。
此文档中,我就介绍如何用ABAP创建一个简单的树型菜单!下面几个步骤只讲创建树型菜单几个重要的地方,最后面是详细的实现代码。
建议学者粗略看看步骤,重点看最后的代码,然后自己学着按下面的DEMO写测试程序,直到成功为止,如有不懂的地方,可以到群内留言。
或者文档有写得不好的地方,也可以提出来,我们一起加以改善!一. 创建一个DIALOG屏幕(0900),创建一个定制控制: TREE_CONTAINER,作为一个容器来存放程序创建的树型菜单,如下图所示:二. 在屏幕PBO事件中,创建一个MOUDLE: m_init_tree,然后创建一个Subroutine: frm_init_tree。
在Subroutine中创建一个Object: g_application,g_application指向自己创建的一个Class:lcl_application。
这个Class主要定义了一些事件,比如单击,双击,展开,链接单击等事件,用来注册及捕获树型菜单的父节点,子节点单击,双击,展开,链接单击等事件,然后在自己Class :lcl_application中相应自定义的Method中写相应的Code,实现特殊的操作。
三. 用程序创建一个容器类cl_gui_custom_container的实例g_custom_container,代码如下CREATE OBJECT g_custom_containerEXPORTINGcontainer_name = 'TREE_CONTAINER'EXCEPTIONScntl_error = 1cntl_system_error = 2create_error = 3lifetime_error = 4lifetime_dynpro_dynpro_link = 5.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.从上面的代码可以看出,程序创建了一个指向步骤一创建的定制控制: TREE_CONTAINER一个自定义容器类.四. 设置树型菜单名称,宽度,菜单列数,并创建树型菜单Class:cl_gui_column_tree实例:g_tree,并和屏幕容器相关联hierarchy_header-heading = '资源管理'. "树型菜单名称hierarchy_header-width = 50. "宽度CREATE OBJECT g_treeEXPORTINGparent = g_custom_container "将创建的树型菜单和屏幕容器相关联 node_selection_mode = cl_gui_column_tree=>node_sel_mode_single "模式 item_selection = 'X'hierarchy_column_name = c_column-column1 "列数hierarchy_header = hierarchy_headerEXCEPTIONScntl_system_error = 1create_error = 2failed = 3illegal_node_selection_mode = 4illegal_column_name = 5lifetime_error = 6.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.五. 定义树型菜单的一些事件,比如单击,双击等" node double click根节点双击event-eventid = cl_gui_column_tree=>eventid_node_double_click.event-appl_event = 'X'. " process PAI if event occursAPPEND event TO events." item double click子节点双击event-eventid = cl_gui_column_tree=>eventid_item_double_click.event-appl_event = 'X'.APPEND event TO events." expand no children展开文件event-eventid = cl_gui_column_tree=>eventid_expand_no_children.event-appl_event = 'X'.APPEND event TO events." link click链接单击,我认为是最后的子节点单击event-eventid = cl_gui_column_tree=>eventid_link_click.event-appl_event = 'X'.APPEND event TO events." button clickevent-eventid = cl_gui_column_tree=>eventid_button_click.event-appl_event = 'X'.APPEND event TO events." checkbox changeevent-eventid = cl_gui_column_tree=>eventid_checkbox_change.event-appl_event = 'X'.APPEND event TO events." header clickevent-eventid = cl_gui_column_tree=>eventid_header_click.event-appl_event = 'X'.APPEND event TO events.设置类实例g_tree的相关事件,因为类g_tree的属性event默认为空,所以在这里要调用set_registered_events设置事件CALL METHOD g_tree->set_registered_eventsEXPORTINGevents = eventsEXCEPTIONScntl_error = 1cntl_system_error = 2illegal_event_combination = 3.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.六. 注册树型菜单事件到第二步中创建的类lcl_application的实例g_application,然后我们就可以在g_application中相关的方法中捕获树型菜单的相关事件,写自己的程序作特殊的处理。
比如SET HANDLER g_application->handle_node_double_click FOR g_tree.注册树型菜单双击事件句柄七. 添加树型菜单子节点主要用到树型菜单的g_tree的treev_ntab属性treev_ntab的四个属性非常重要,一个是node_key,就是为此节点起命名,树型菜单中的每一个节点都必须有一个命名,并且必须唯一。
第二个属性是relatkey,就是指定本节点从属于那一个节点之下,也就是指定它的上级节点,如果是根节点,就无需指定。
第三个属性isfolder,就是说指定节点是否允许有子节点。
第四个expander就是节点是否可以展开。
节点的属性设置好后,就可以调用g_tree的method: add_nodes_and_items来添加树型菜单节点,以下的DEMO就刚开始就添加了”业扩工程”,“在建工程”,”改造工程”三个根节点。
八. 展示根节点,调用g_tree的expand_node方法将第七步的三个根节点进行展示.启动程序,将会看到屏幕上就有了一个简单的树型菜单,至于怎么在这三个根节点下再加子节点,读者就自己看OK_CODE:ADD事件里的代码,道理是一样的。
完整的程序代码*&---------------------------------------------------------------------**& Report YTEST2*&*&---------------------------------------------------------------------**&*&*&---------------------------------------------------------------------*REPORT y_tree_test.TYPES: item_table_type LIKE STANDARD TABLE OF mtreeitmWITH DEFAULT KEY.DATA: it_pic_data TYPE TABLE OF /sc1/pic_data,it_data_output TYPE TABLE OF /sc1/pic_data,wa_pic_data TYPE /sc1/pic_data,it_data_collect TYPE TABLE OF /sc1/pic_data,wa_data_collect TYPE /sc1/pic_data.DATA: it_data TYPE TABLE OF bapiconten WITH HEADER LINE.DATA: v_url(255) TYPE c,v_index TYPE i.DATA: g_event(30),g_node_key TYPE tv_nodekey,g_item_name TYPE tv_itmname,g_header_name TYPE tv_hdrname.DATA: o_container TYPE REF TO cl_gui_custom_container,o_container1 TYPE REF TO cl_gui_custom_container,o_container2 TYPE REF TO cl_gui_custom_container,o_container3 TYPE REF TO cl_gui_custom_container,o_container4 TYPE REF TO cl_gui_custom_container,o_container5 TYPE REF TO cl_gui_custom_container,o_container6 TYPE REF TO cl_gui_custom_container,o_picture TYPE REF TO cl_gui_picture,o_picture1 TYPE REF TO cl_gui_picture,o_picture2 TYPE REF TO cl_gui_picture,o_picture3 TYPE REF TO cl_gui_picture,o_picture4 TYPE REF TO cl_gui_picture,o_picture5 TYPE REF TO cl_gui_picture,o_picture6 TYPE REF TO cl_gui_picture.DATA: total_page(255) TYPE c VALUE '第3页/共5页'.DATA: g_tc_pic_upload_lines LIKE sy-loopc.DATA p_comp_code LIKE t001-bukrs.DATA p_prctr TYPE /dsd/sl_bso.DATA p_kunnr TYPE kna1-kunnr.DATA pic_name(30) TYPE c..DATA p_pic_type TYPE /sc1/e_pic_type.DATA pic_name1 TYPE name1.DATA pic_num TYPE /sc1/pic_num.DATA g_1st_time TYPE xflag.DATA: node_table TYPE treev_ntab,node TYPE treev_node,item_table TYPE item_table_type,item TYPE mtreeitm,lv_nodekey TYPE tv_nodekey.DATA: ok_code TYPE sy-ucomm.CONSTANTS:BEGIN OF c_nodekey,root TYPE tv_nodekey VALUE 'root',root2 TYPE tv_nodekey VALUE 'root2',root3 TYPE tv_nodekey VALUE 'root3', "#EC NOTEXT child1 TYPE tv_nodekey VALUE 'Child1', "#EC NOTEXT child2 TYPE tv_nodekey VALUE 'Child2', "#EC NOTEXT new1 TYPE tv_nodekey VALUE 'New1', "#EC NOTEXT new2 TYPE tv_nodekey VALUE 'New2', "#EC NOTEXT * new3 type tv_nodekey value 'New3', "#EC NOTEXT * new4 type tv_nodekey value 'New4', "#EC NOTEXT END OF c_nodekey,BEGIN OF c_column,column1 TYPE tv_itmname VALUE 'column1', "#EC NOTEXT column2 TYPE tv_itmname VALUE 'column2', "#EC NOTEXTcolumn3 TYPE tv_itmname VALUE 'column3', "#EC NOTEXT column4 TYPE tv_itmname VALUE 'column4',column5 TYPE tv_itmname VALUE 'column5',column6 TYPE tv_itmname VALUE 'column6',column7 TYPE tv_itmname VALUE 'column7',column8 TYPE tv_itmname VALUE 'column8',END OF c_column.*----------------------------------------------------------------------* * CLASS lcl_application DEFINITION*----------------------------------------------------------------------* **----------------------------------------------------------------------* CLASS lcl_application DEFINITION.PUBLIC SECTION.METHODS:handle_node_double_clickFOR EVENT node_double_clickOF cl_gui_column_treeIMPORTING node_key,handle_header_clickFOR EVENT header_clickOF cl_gui_column_treeIMPORTING header_name,handle_expand_no_childrenFOR EVENT expand_no_childrenOF cl_gui_column_treeIMPORTING node_key,handle_item_double_clickFOR EVENT item_double_clickOF cl_gui_column_treeIMPORTING node_key item_name,handle_button_clickFOR EVENT button_clickOF cl_gui_column_treeIMPORTING node_key item_name,handle_link_clickFOR EVENT link_clickOF cl_gui_column_treeIMPORTING node_key item_name,handle_checkbox_changeFOR EVENT checkbox_changeOF cl_gui_column_treeIMPORTING node_key item_name checked.ENDCLASS. "LCL_APPLICATION DEFINITION*----------------------------------------------------------------------* * CLASS LCL_APPLICATION IMPLEMENTATION*----------------------------------------------------------------------* **----------------------------------------------------------------------* CLASS lcl_application IMPLEMENTATION.METHOD handle_node_double_click." this method handles the node double click event of the tree" control instance" show the key of the double clicked node in a dynpro field* g_event = 'NODE_DOUBLE_CLICK'.* g_node_key = node_key.CLEAR wa_pic_data.CLEAR it_data[].ENDMETHOD. "HANDLE_NODE_DOUBLE_CLICKMETHOD handle_header_click." this method handles header click event of the tree" control instance" show the name of the clicked header in a dynpro fieldg_event = 'HEADER_CLICK'.g_header_name = header_name.CLEAR: g_node_key, g_item_name.ENDMETHOD. "HANDLE_HEADER_CLICKMETHOD handle_item_double_click." this method handles the item double click event of the tree" control instanceDATA lwa_bds TYPE bds_conn00.DATA: bdcdata_wa TYPE bdcdata,bdcdata_tab TYPE TABLE OF bdcdata.DATA opt TYPE ctu_params.opt-dismode = 'E'.opt-defsize = 'X'." show the key of the node and the name of the item" of the double clicked item in a dynpro fieldg_event = 'ITEM_DOUBLE_CLICK'.g_node_key = node_key.g_item_name = item_name.CLEAR wa_pic_data.CLEAR it_data[].SELECT SINGLE * INTO CORRESPONDING FIELDS OF wa_pic_data FROM /sc1/pic_data WHERE /sc1/pic_data~pic_num = g_node_key.IF sy-subrc EQ 0.IF o_picture1 IS INITIAL.CREATE OBJECT: o_container1 EXPORTING container_name = 'PIC_CONTAINER1', o_picture1 EXPORTING parent = o_container1.CLEAR v_url.* READ TABLE it_pic_data INTO wa_pic_data INDEX v_index.* pic_name = wa_pic_data-pic_nam.CALL FUNCTION '/SC1/TIN_BD_GET_TO_TAB'EXPORTINGdoc_id = wa_pic_data-loio_idTABLESet_file_content = it_data.CALL FUNCTION 'DP_CREATE_URL'EXPORTINGtype = 'IMAGE'subtype = 'X-UNKNOWN'TABLESdata = it_dataCHANGINGurl = v_url.CALL METHOD o_picture1->load_picture_from_urlEXPORTINGurl = v_url.CALL METHOD o_picture1->set_display_modeEXPORTINGdisplay_mode = o_picture1->display_mode.ELSE.CLEAR v_url.* READ TABLE it_pic_data INTO wa_pic_data INDEX v_index.* pic_name = wa_pic_data-pic_nam.CALL FUNCTION '/SC1/TIN_BD_GET_TO_TAB'EXPORTINGdoc_id = wa_pic_data-loio_idTABLESet_file_content = it_data.CALL FUNCTION 'DP_CREATE_URL'EXPORTINGtype = 'IMAGE'subtype = 'X-UNKNOWN'TABLESdata = it_dataCHANGINGurl = v_url.CALL METHOD o_picture1->clear_picture.CALL METHOD o_picture1->load_picture_from_urlEXPORTINGurl = v_url.CALL METHOD cl_gui_cfw=>flush.IF sy-subrc EQ 0.CALL METHOD o_picture1->set_display_modeEXPORTINGdisplay_mode = o_picture1->display_mode.ENDIF.ENDIF.pic_name1 = wa_pic_data-pic_nam.pic_num = wa_pic_data-pic_num.ENDIF.ENDMETHOD. "HANDLE_ITEM_DOUBLE_CLICKMETHOD handle_link_click." this method handles the link click event of the tree " control instance" show the key of the node and the name of the item" of the clicked link in a dynpro fieldg_event = 'LINK_CLICK'.g_node_key = node_key.g_item_name = item_name.CLEAR g_header_name.ENDMETHOD. "HANDLE_LINK_CLICKMETHOD handle_button_click." this method handles the button click event of the tree" control instance" show the key of the node and the name of the item" of the clicked button in a dynpro fieldg_event = 'BUTTON_CLICK'.g_node_key = node_key.g_item_name = item_name.CLEAR g_header_name.ENDMETHOD. "HANDLE_BUTTON_CLICKMETHOD handle_checkbox_change ." this method handles the checkbox_change event of the tree " control instance* DATA checked TYPE as4flag." show the key of the node and the name of the item" of the clicked checkbox in a dynpro fieldg_event = 'CHECKBOX_CHANGE'.g_node_key = node_key.g_item_name = item_name.CLEAR g_header_name.CASE node-relatkey .WHEN 'root'.WHEN 'root3'.ENDCASE.ENDMETHOD. "HANDLE_CHECKBOX_CHANGEMETHOD handle_expand_no_children.ENDMETHOD. "HANDLE_EXPAND_NO_CHILDREN ENDCLASS. "LCL_APPLICATION IMPLEMENTATIONDATA: g_application TYPE REF TO lcl_application,g_custom_container TYPE REF TO cl_gui_custom_container,g_tree TYPE REF TO cl_gui_column_tree,g_ok_code TYPE sy-ucomm.START-OF-SELECTION.CALL SCREEN 0900.*&---------------------------------------------------------------------* *& Module STATUS_0900 OUTPUT*&---------------------------------------------------------------------* * text*----------------------------------------------------------------------* MODULE status_0900 OUTPUT.SET PF-STATUS 'STATUS_0900'.* SET TITLEBAR 'xxx'.ENDMODULE. " STATUS_0900 OUTPUT*&---------------------------------------------------------------------* *& Module M_INIT_TREE OUTPUT*&---------------------------------------------------------------------* * text*----------------------------------------------------------------------* MODULE m_init_tree OUTPUT.PERFORM frm_init_tree.ENDMODULE. " M_INIT_TREE OUTPUT*&---------------------------------------------------------------------* *& Form FRM_INIT_TREE*&---------------------------------------------------------------------* * text*----------------------------------------------------------------------* * --> p1 text* <-- p2 text*----------------------------------------------------------------------* FORM frm_init_tree .DATA: node_table TYPE treev_ntab,item_table TYPE item_table_type,event TYPE cntl_simple_event,events TYPE cntl_simple_events,hierarchy_header TYPE treev_hhdr.IF g_tree IS INITIAL.CREATE OBJECT g_application.* create a container for the tree controlCREATE OBJECT g_custom_containerEXPORTING " the container is linked to the custom control with the " name 'TREE_CONTAINER' on the dynprocontainer_name = 'TREE_CONTAINER'EXCEPTIONScntl_error = 1cntl_system_error = 2create_error = 3lifetime_error = 4lifetime_dynpro_dynpro_link = 5.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.* setup the hierarchy headerhierarchy_header-heading = '资源管理'." headinghierarchy_header-width = 50. " width: 30 charactersCREATE OBJECT g_treeEXPORTINGparent = g_custom_containernode_selection_mode = cl_gui_column_tree=>node_sel_mode_single item_selection = 'X'hierarchy_column_name = c_column-column1hierarchy_header = hierarchy_headerEXCEPTIONScntl_system_error = 1create_error = 2failed = 3illegal_node_selection_mode = 4illegal_column_name = 5lifetime_error = 6.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.* define the events which will be passed to the backend" node double clickevent-eventid = cl_gui_column_tree=>eventid_node_double_click. event-appl_event = 'X'. " process PAI if event occursAPPEND event TO events." item double clickevent-eventid = cl_gui_column_tree=>eventid_item_double_click. event-appl_event = 'X'.APPEND event TO events." expand no childrenevent-eventid = cl_gui_column_tree=>eventid_expand_no_children. event-appl_event = 'X'.APPEND event TO events." link clickevent-eventid = cl_gui_column_tree=>eventid_link_click.event-appl_event = 'X'.APPEND event TO events." button clickevent-eventid = cl_gui_column_tree=>eventid_button_click.event-appl_event = 'X'.APPEND event TO events." checkbox changeevent-eventid = cl_gui_column_tree=>eventid_checkbox_change.event-appl_event = 'X'.APPEND event TO events." header clickevent-eventid = cl_gui_column_tree=>eventid_header_click.event-appl_event = 'X'.APPEND event TO events.CALL METHOD g_tree->set_registered_eventsEXPORTINGevents = eventsEXCEPTIONScntl_error = 1cntl_system_error = 2illegal_event_combination = 3.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.* assign event handlers in the application class to each desired event SET HANDLER g_application->handle_node_double_click FOR g_tree.SET HANDLER g_application->handle_item_double_click FOR g_tree.SET HANDLER g_application->handle_expand_no_children FOR g_tree.SET HANDLER g_application->handle_link_click FOR g_tree.SET HANDLER g_application->handle_button_click FOR g_tree.SET HANDLER g_application->handle_checkbox_change FOR g_tree.SET HANDLER g_application->handle_header_click FOR g_tree.PERFORM build_node_and_item_table USING node_table item_table.CALL METHOD g_tree->add_nodes_and_itemsEXPORTINGnode_table = node_tableitem_table = item_tableitem_table_structure_name = 'MTREEITM'EXCEPTIONSfailed = 1cntl_system_error = 3error_in_tables = 4dp_error = 5table_structure_name_not_found = 6.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.* expand the node with key 'Root'CALL METHOD g_tree->expand_nodeEXPORTINGnode_key = c_nodekey-rootEXCEPTIONSfailed = 1illegal_level_count = 2cntl_system_error = 3node_not_found = 4cannot_expand_leaf = 5.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.ENDIF.ENDFORM. " FRM_INIT_TREE*&---------------------------------------------------------------------* *& Form BUILD_NODE_AND_ITEM_TABLE*&---------------------------------------------------------------------* * text*----------------------------------------------------------------------* * -->P_NODE_TABLE text* -->P_ITEM_TABLE text*----------------------------------------------------------------------* FORM build_node_and_item_table USING node_table TYPE treev_ntabitem_table TYPE item_table_type. DATA: node TYPE treev_node,item TYPE mtreeitm.* Build the node table.* Caution: The nodes are inserted into the tree according to the order * in which they occur in the table. In consequence, a node must not* must not occur in the node table before its parent node.* Node with key 'Root'node-node_key = c_nodekey-root." Key of the nodeCLEAR node-relatkey. " Special case: A root node has no parent CLEAR node-relatship. " node.CLEAR node-n_image. " Folder-/ Leaf-Symbol in state "closed": " use default.CLEAR node-exp_image. " Folder-/ Leaf-Symbol in state "open":" use defaultCLEAR node-expander. " see below.* node-relatship = cl_gui_column_tree=>relat_last_child.node-hidden = ' '. " The node is visible,node-disabled = ' '. " selectable,node-isfolder = 'X'. " a folder.node-expander = 'X'.APPEND node TO node_table.node-node_key = c_nodekey-root2." Key of the nodeCLEAR node-relatkey. " Special case: A root node has no parent CLEAR node-relatship. " node.CLEAR node-n_image. " Folder-/ Leaf-Symbol in state "closed": " use default.CLEAR node-exp_image. " Folder-/ Leaf-Symbol in state "open":" use defaultCLEAR node-expander. " see below.* node-relatship = cl_gui_column_tree=>relat_last_child.node-hidden = ' '. " The node is visible,node-disabled = ' '. " selectable,node-isfolder = 'X'. " a folder.node-expander = 'X'.APPEND node TO node_table.node-node_key = c_nodekey-root3." Key of the nodeCLEAR node-relatkey. " Special case: A root node has no parent CLEAR node-relatship. " node.CLEAR node-n_image. " Folder-/ Leaf-Symbol in state "closed": " use default.CLEAR node-exp_image. " Folder-/ Leaf-Symbol in state "open": " use defaultCLEAR node-expander. " see below.* node-relatship = cl_gui_column_tree=>relat_last_child.node-hidden = ' '. " The node is visible,node-disabled = ' '. " selectable,node-isfolder = 'X'. " a folder.node-expander = 'X'.APPEND node TO node_table.* Node with key 'Root'CLEAR item.item-node_key = c_nodekey-root.item-item_name = c_column-column1. " Item of Column 'Column1' item-class = cl_gui_column_tree=>item_class_text. " Text Itemitem-text = '业扩工程'.APPEND item TO item_table.CLEAR item.item-node_key = c_nodekey-root3.item-item_name = c_column-column1. " Item of Column 'Column1' item-class = cl_gui_column_tree=>item_class_text. " Text Itemitem-text = '在建工程'.APPEND item TO item_table.*CLEAR item.item-node_key = c_nodekey-root2.item-item_name = c_column-column1. " Item of Column 'Column1'item-class = cl_gui_column_tree=>item_class_text. " Text Itemitem-text = '改造工程'.APPEND item TO item_table.ENDFORM. " BUILD_NODE_AND_ITEM_TABLE*&---------------------------------------------------------------------**& Module CANCEL_9000 INPUT*&---------------------------------------------------------------------** text*----------------------------------------------------------------------* MODULE cancel_9000 INPUT.CASE ok_code .WHEN 'BACK' OR 'EXIT'.LEAVE PROGRAM.WHEN 'CANCY'.LEAVE PROGRAM.ENDCASE.ENDMODULE. " CANCEL_9000 INPUT*&---------------------------------------------------------------------**& Module USER_COMMAND_0900 INPUT*&---------------------------------------------------------------------** text*----------------------------------------------------------------------* MODULE user_command_0900 INPUT.DATA: node_delete TYPE treev_upno.DATA lv_vbeln TYPE vbeln_vl.DATA: it_delete_nodes TYPE treev_nks.DATA: wa_delete_nodes TYPE tv_nodekey.CLEAR: it_data_collect[].CASE ok_code.WHEN 'ADD'.CLEAR: it_data_collect[].CALL METHOD g_tree->delete_all_nodes.CLEAR: node_table[], item_table[].PERFORM build_node_and_item_table USING node_table item_table.* 业扩工程下面添加一个节点分城镇和居民PERFORM frm_node_item_create USING 'COMP1' c_nodekey-root '城镇居民' ''. PERFORM frm_node_item_create USING 'PRCTR1' 'COMP1' 'AAAA' ''.PERFORM frm_node_item_create USING 'COMP2' c_nodekey-root '农村居民' ''. PERFORM frm_node_item_create USING 'PRCTR2' 'COMP2' 'BBBB' ''.CALL METHOD g_tree->add_nodes_and_itemsEXPORTINGnode_table = node_table item_table = item_table item_table_structure_name = 'MTREEITM' EXCEPTIONSfailed = 1cntl_system_error = 3error_in_tables = 4dp_error = 5table_structure_name_not_found = 6.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.* expand the node with key 'Root'CALL METHOD g_tree->expand_nodeEXPORTINGnode_key = c_nodekey-rootEXCEPTIONSfailed = 1illegal_level_count = 2cntl_system_error = 3node_not_found = 4cannot_expand_leaf = 5.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.CALL METHOD g_tree->expand_nodeEXPORTINGnode_key = c_nodekey-root2EXCEPTIONSfailed = 1illegal_level_count = 2cntl_system_error = 3node_not_found = 4cannot_expand_leaf = 5.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.CALL METHOD g_tree->expand_nodeEXPORTINGnode_key = c_nodekey-root3EXCEPTIONSfailed = 1illegal_level_count = 2cntl_system_error = 3node_not_found = 4cannot_expand_leaf = 5.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.IF p_kunnr IS NOT INITIAL.CALL METHOD g_tree->expand_root_nodesEXPORTINGlevel_count = 4.ENDIF.ENDCASE.ENDMODULE. " USER_COMMAND_0900 INPUT*&---------------------------------------------------------------------* *& Form FRM_NODE_ITEM_CREATE*&---------------------------------------------------------------------* * text*----------------------------------------------------------------------* * -->P_1221 text* -->P_C_NODEKEY_ROOT text* -->P_1223 text* -->P_1224 text*----------------------------------------------------------------------* FORM frm_node_item_create USING p_p_nodekeyp_p_relatkeyp_p_item_textp_p_last_child.node-node_key = p_p_nodekey." Key of the node* CLEAR node.CLEAR node-relatkey. " Special case: A root node has no parent CLEAR node-relatship. " node.CLEAR node-n_image. " Folder-/ Leaf-Symbol in state "closed": " use default.CLEAR node-exp_image. " Folder-/ Leaf-Symbol in state "open":" use defaultCLEAR node-expander. " see below.IF p_p_last_child = 'X'.node-relatship = cl_gui_column_tree=>relat_last_child.node-isfolder = ''.node-expander = ''.node-last_hitem = p_p_nodekey.ELSE.node-isfolder = 'X'. " a folder.node-expander = 'X'.ENDIF.node-relatkey = p_p_relatkey.node-hidden = ' '. " The node is visible,node-disabled = ' '. " selectable,APPEND node TO node_table.CLEAR item.item-node_key = p_p_nodekey .item-item_name = c_column-column1. " Item of Column 'Column1' item-class = cl_gui_column_tree=>item_class_text. " Text Itemitem-text = p_p_item_text.APPEND item TO item_table.ENDFORM. " FRM_NODE_ITEM_CREATE。