"根据输入的类,找到继承类的最终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.