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

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

Tree 节点的增删改是很重要的功能,包括:增加本级节点,增加子节点,修改节点,删

除节点。完成后效果如下:

选择根节点,单击右键,弹出右键菜单,如选择“北京”节点,选择“增加本级节点”

菜单,如图9-5 所示。

在单击文本输入“广州”后,单击“更新”按钮,如图9-6 所示。

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

9-7 所示。

输入“天河区”,单击“更新”按钮,如图9-8 所示。

增加节点后,输出结果如图9-9 所示。

除上述功能外,还有修改及删除节点等功能。

设计 Screen 界面如图9-10 所示。

主程序:

REPORT ytest35.
DATA: ok_code TYPE sy-ucomm,
      save_ok TYPE sy-ucomm.
DATA: wa_container        TYPE scrfname VALUE 'TREE1',
      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,
      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 = str1 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
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
* SET PF-STATUS 'xxxxxxxx'.
* SET TITLEBAR 'xxx'.
  IF wa_custom_container IS INITIAL.
    CREATE OBJECT g_application.
    PERFORM create_tree.
  ENDIF.
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  DATA str1 TYPE tv_nodekey.
  save_ok = ok_code.
  CLEAR ok_code.
  CASE save_ok.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
    WHEN 'GETKEY'.
      CALL METHOD wa_tree->get_selected_node
        IMPORTING
          node_key = str1.
      IF sy-subrc EQ 0.
        getkey = str1.
      ENDIF.
    WHEN 'UPTREE'.
      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.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
          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.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
          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.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
          ENDIF.
      ENDCASE.
  ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*& Form CREATE_TREE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 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.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
  CLEAR node1.
  node1-node_key = '国家'.
  CLEAR node1-relatkey.
  CLEAR node1-relatship.
  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 = '城市北京'.
  node1-relatkey = '国家'.
  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 = '城市上海'.
  node1-relatkey = '国家'.
  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 = 'KEY 崇文区'.
  node1-relatkey = '城市北京'.
  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 = 'KEY 西城区'.
  node1-relatkey = '城市北京'.
  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 = 'KEY 闵行区'.
  node1-relatkey = '城市上海'.
  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
* EXCEPTIONS
*     ERROR_IN_NODE_TABLE  = 1
*     FAILED               = 2
*     DP_ERROF             = 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.
  CALL METHOD wa_tree->expand_node
    EXPORTING
      node_key            = '国家'
      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
* EXCEPTIONS
*     CNTL_ERROR = 1
*     CNTL_SYSTEM_ERROR = 2
*     ILLEGAL_EVENT_COMBINATION = 3
*     OTHERS = 4
    .
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
*将已定义的双击事件分配至树对象
  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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ᝰ随心ꦿེএ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值