ABAP Tree Control的使用

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 = '@[email protected]'.
  NODE1-EXP_IMAGE = '@[email protected]'.
  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 = '@[email protected]'.
  NODE1-EXP_IMAGE = '@[email protected]'.
  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 = '@[email protected]'.
  NODE1-EXP_IMAGE = '@[email protected]'.
  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 = '@[email protected]'.
    NODE1-EXP_IMAGE = '@[email protected]'.
    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 = '@[email protected]'.
          node1-exp_image = '@[email protected]'.
          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 = '@[email protected]'.
          node1-exp_image = '@[email protected]'.
          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 = '@[email protected]'.
  node1-exp_image = '@[email protected]'.
  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 = '@[email protected]'.
  node1-exp_image = '@[email protected]'.
  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 = '@[email protected]'.
  node1-exp_image = '@[email protected]'.
  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 = '@[email protected]'.
    NODE1-EXP_IMAGE = '@[email protected]'.
    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.
时间: 2024-10-12 06:17:36

ABAP Tree Control的使用的相关文章

实例:ABAP Tree Control 使用

Tree Control 是最常用的Windows控件之一,在其他语言中成为"Tree View"等,ABAP的 Tree Contiol 能实现类似的功能, 下面实例一个简单的 Tree Control. 1. 创建一个ABAP程序 2. 在程序中添加一个屏幕100,使用屏幕制作器,建立Screen,添加屏幕对象 创建好的屏幕和对象界面如图: 屏幕元素清单 逻辑流程序 PROCESS BEFORE OUTPUT. MODULE STATUS_0100. * PROCESS AFTER

ABAP table control例子

[转自]http://blog.csdn.net/lhx20/article/details/3039909Table control用于在screen上以表格的形式显示数据,在table control中,可以使用table elements,keywords,,templates,radio buttons,radio button groups和pushbuttons.一行可以有255个columns.每个column可以有一个title.Table control可以用来显示single

(八)树控件(Tree Control),标签控件(tab control)

树控件 基于对话框创建工程 // 01_TreeCtrlDlg.cpp : 实现文件 // #include "stdafx.h" #include "01_TreeCtrl.h" #include "01_TreeCtrlDlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg

ABAP实战屏幕SCREEN设计(二)

屏幕(SCREEN)是ABAP设计最重要的工作之一,SAP的单据.主数据维护等业务功能都使用屏幕,一个程序可以包含多个屏幕. 上一篇博文"ABAP实战屏幕SCREEN设计(一)"主要介绍了以下内容: (1)第一个"HELLO WORLD" Screen程序 (2)工具条和菜单设计 (3)屏幕对象 (4)数据字典关联字段 (5)逻辑流 (6)下拉框设计 本篇博文将继续介绍剩下内容,主要包含 (1)修改屏幕状态 (2)子窗口(Subscreen) (3)表条目控制 (4

ABAP的自学之路 ,初步认识ABAP &lt;一&gt;

由于工作的关系,最近需要对SAP系统进行二次开发,于是开始学习ABAP.鉴于网上对于ABAP的资料少之又少,所以自己整理一些资料. 第一章 ABAP 开发环境和总体介绍1.1 ABAP 开发环境ABAP 开发的三种环境:(1)SAP 正式系统环境:(2)SAP IDES 系统环境(学习环境):(3)MINISAP 环境.三种环境中均含有大量的例子程序,事务代码(TCODE):Abapdocu.三种环境都能够实现全部功能的 ABAP 开发(包括数据库编程).SAP 正式环境含有业务功能并能进行开发

ALV Tree

找相关的alv tree demo:se38 -> bcalv_tree* 1.创建对话屏幕 由于ALV没有专门实现的控件,需要先在对话屏幕100上增加一个用户自定义控件区域(Custom Control),名为CONTAINER1 2.demo源码 *&---------------------------------------------------------------------* *& Report YALV_TREE *&-------------------

10+ 最流行的 jQuery Tree 菜单插件

jstree – jQuery Tree Plugin With HTML & JSON Data jstree is a lightweight and flexible jQuery plugin to create tree menu from HTML & JSON data sources sources.This jQuery Plugin Support AJAX & async callback loading.It is absolutely free, open

Overview of Form Control Types [AX 2012]

Overview of Form Control Types [AX 2012] Other Versions 0 out of 1 rated this helpful - Rate this topic Updated: October 11, 2011 Applies To: Microsoft Dynamics AX 2012 R3, Microsoft Dynamics AX 2012 R2, Microsoft Dynamics AX 2012 Feature Pack, Micro

学习分享 lex tree diffrient row height(tree的行高调节)

Creating a Flex Tree with variable height rows can be mysteriously difficult if you are new to Flex item renderers.  This cookbook will give you the step by step instructions to creating a Tree control with variable height renderers. First you will n