ABAP 继承类的树形展示(ClassTree)

本ABAP程序用于创建指定类的完整继承树,并显示从根类到所有子类的关系。用户可通过双击节点直接进入SE24进行类详情查看。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

"根据输入的类,找到继承类的最终superclass,并显示该根类下的所有继承类.双击类,可以进入SE24,查看具体类信息.

*&---------------------------------------------------------------------*
*& Report  ZCLASSTREE
*&---------------------------------------------------------------------*
*& Author: Lijq21@qq.com   (参考qiangsheng  2009年源码改编)
*& Create: 20180724
*& This Program can find the inheritance tree of a class,
*& from it's root class, to all the sub-class of this root.
*&---------------------------------------------------------------------*
REPORT  zclasstree NO STANDARD PAGE HEADING LINE-SIZE 255.
TABLES: seometarel, seoclass.
PARAMETERS: pclsname LIKE seometarel-clsname OBLIGATORY.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN COMMENT /1(80) comm1.
SELECTION-SCREEN COMMENT /1(80) comm2.

DATA:t_node       TYPE snodetext,
     node_tab     LIKE t_node OCCURS 0 WITH HEADER LINE,
     node_tab_tmp LIKE t_node OCCURS 0 WITH HEADER LINE,
     fclsname     LIKE seometarel-clsname.

FIELD-SYMBOLS:<fs_node> TYPE snodetext.

AT SELECTION-SCREEN OUTPUT.
  comm1 = 'Fill in the class name, will create inheritance tree for the class.'.
  comm2 = 'In the tree list, double click a node to go to the Class Builder.'.

AT SELECTION-SCREEN.

  SELECT SINGLE * FROM seoclass WHERE clsname = pclsname.

  IF sy-subrc NE 0.
    MESSAGE 'Class not exist!'(m01) TYPE 'E'.
  ENDIF.

START-OF-SELECTION.
  fclsname = pclsname.
* Search for the root class.
  DO.
    SELECT SINGLE * FROM seometarel WHERE clsname = fclsname AND reltype = 2.
    IF sy-subrc EQ 0.
      fclsname = seometarel-refclsname.
    ELSE.
      EXIT.
    ENDIF.
  ENDDO.
* Search for all sub-class and create the list tree.
  PERFORM search_subclass USING fclsname '01' 1 0.

  IF lines( node_tab ) EQ 1.
    MESSAGE 'Class is standalone.'(m02) TYPE 'S'.
  ENDIF.

*---Get class description .
  DATA:ls_seoclasstx LIKE seoclasstx,
       lt_seoclasstx LIKE TABLE OF seoclasstx.
  CLEAR:lt_seoclasstx.
  SELECT clsname descript FROM seoclasstx INTO CORRESPONDING FIELDS OF TABLE lt_seoclasstx
                     FOR ALL ENTRIES IN node_tab
                                  WHERE clsname = node_tab-name
                                    AND langu   = sy-langu.
  SORT lt_seoclasstx BY clsname.
  LOOP AT node_tab ASSIGNING <fs_node>.
    READ TABLE lt_seoclasstx INTO ls_seoclasstx WITH KEY clsname = <fs_node>-name BINARY SEARCH.
    IF sy-subrc = 0.
      <fs_node>-text = ls_seoclasstx-descript.
    ENDIF.
  ENDLOOP.
* Create the list tree.
  node_tab_tmp[]  = node_tab[].
  CLEAR:node_tab[],node_tab.

  SORT node_tab_tmp BY tlevel name.

  READ TABLE node_tab_tmp WITH KEY tlevel = 1.
  IF sy-subrc = 0.
    CLEAR:node_tab.
    node_tab = node_tab_tmp.
    APPEND node_tab.

    PERFORM get_subtree USING node_tab_tmp-id.
  ENDIF.

  CALL FUNCTION 'RS_TREE_CONSTRUCT'
    TABLES
      nodetab = node_tab.

  CALL FUNCTION 'RS_TREE_LIST_DISPLAY'
    EXPORTING
      callback_program      = sy-cprog "sy-repid
      callback_user_command = 'USER_COMMAND'
      status                = 'STANDARD'.

END-OF-SELECTION.
*&---------------------------------------------------------------------*
*&      Form  search_subclass
*&---------------------------------------------------------------------*
FORM search_subclass  USING uclsname
                            ulevel
                            uid TYPE seu_id
                            uparent TYPE seu_id.

  DATA: clevel        TYPE n LENGTH 2,
        lv_parent     TYPE seu_id,
        ls_seometarel LIKE seometarel,
        lt_seometarel LIKE TABLE OF seometarel.

  node_tab-id       = uid.
  node_tab-parent   = uparent.
  node_tab-type     = 'P'.
  node_tab-name     = uclsname.
  node_tab-tlevel   = ulevel.
  node_tab-nlength  = '40'.
  IF uclsname EQ pclsname.
    node_tab-color = 6.
  ELSE.
    node_tab-color = 4.
  ENDIF.

  node_tab-tlength = '70'.
  node_tab-tcolor  = 3.
  APPEND node_tab.

  CLEAR:lt_seometarel.
  SELECT clsname FROM seometarel INTO CORRESPONDING FIELDS OF TABLE lt_seometarel
                WHERE refclsname = uclsname.
  lv_parent = uid.
  LOOP AT lt_seometarel INTO ls_seometarel.
    clevel = ulevel + 1.
    uid    = uid + 1.
    PERFORM search_subclass USING ls_seometarel-clsname clevel uid lv_parent.
  ENDLOOP.
ENDFORM.                    " search_subclass
*&---------------------------------------------------------------------*
*&      Form  user_command
*&---------------------------------------------------------------------*
FORM user_command TABLES node STRUCTURE seucomm
                   USING command
                CHANGING exit
                         list_refresh.
  DATA:lv_field(20),
       lv_val(18).

  GET CURSOR FIELD lv_field VALUE lv_val.

  IF command EQ 'TRPI' AND lv_field = 'NODELIST-NAME'.
    SET PARAMETER ID 'CLASS' FIELD node-name.
    CALL TRANSACTION 'SE24' AND SKIP FIRST SCREEN.
  ENDIF.
ENDFORM.                    "user_command
*&---------------------------------------------------------------------*
*&      Form  GET_SUBTREE
*&---------------------------------------------------------------------*
FORM get_subtree  USING p_tmp_id.
  LOOP AT node_tab_tmp INTO t_node WHERE parent = p_tmp_id.
    CLEAR:node_tab.
    node_tab = t_node.
    APPEND node_tab.
    PERFORM get_subtree USING t_node-id.
  ENDLOOP.
  DELETE node_tab_tmp WHERE parent = p_tmp_id.
ENDFORM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值