zoukankan      html  css  js  c++  java
  • SAP屏幕设计器专题:树控件的使用(九)

    在SAP的标准画面中,树控件都是随处可见,在一些特殊的应用中更有用处, 显得专业。

    在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.
    TYPESNODE_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!
    DATAG_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.
    DATAG_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.
      DATAL_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>.
        CLEARNODE-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、运行结果:

    至此,树控件设置结束。

  • 相关阅读:
    服务器运行jupyter,本地浏览器打开
    转载--对batch normalization的理解
    Deep Neural Networks for YouTube Recommendations YouTube的经典推荐框架
    IFrame与window对象(contentWindow)
    vue之watch的理解
    关于npm
    简单的输入法效果(类似百度输入时候的智能检索)
    Js屏蔽网页复制,不能使用右键菜单,禁止复制网页内容,不能选中内容,右键不让用,无法拖拽选择,这么多功能,用JS一句代码就搞定了
    移动端关于计算rem的flexible.js
    解决安卓手机在input获取焦点时候固定定位元素被输入键盘给顶到顶部
  • 原文地址:https://www.cnblogs.com/saper/p/2334616.html
Copyright © 2011-2022 走看看