Всем привет. Имеется программа:
Code:
report z_my_program.
DATA: n_level TYPE I,
n_count type i,
count type i.
TYPES: BEGIN OF ty_hrp1001,
objid type hrp1001-objid,
sobid type hrp1001-sobid,
stext type hrp1000-stext,
objid1 type hrp1001-objid,
END OF ty_hrp1001.
DATA : it_hrp1001 TYPE TABLE OF ty_hrp1001.
DATA : wa_hrp1001 TYPE ty_hrp1001.
FIELD-SYMBOLS: <fs1001> like line of it_hrp1001.
TYPES: BEGIN OF ty_hrp1002,
objid type hrp1001-objid,
sobid type hrp1001-sobid,
stext type hrp1000-stext,
objid1 type hrp1001-objid,
END OF ty_hrp1002.
DATA : it_hrp1002 TYPE TABLE OF ty_hrp1002.
DATA : wa_hrp1002 TYPE ty_hrp1002.
FIELD-SYMBOLS: <fs1002> like line of it_hrp1002.
TYPES: BEGIN OF ty_hrp1003,
objid type hrp1001-objid,
sobid type hrp1001-sobid,
objid1 type hrp1001-objid,
stext type hrp1000-stext,
END OF ty_hrp1003.
DATA : it_hrp1003 TYPE TABLE OF ty_hrp1003.
DATA : wa_hrp1003 TYPE ty_hrp1003.
FIELD-SYMBOLS: <fs1003> like line of it_hrp1003.
***Data Table decleration for FM RS_TREE_CONSTRUCT
DATA: IT_NODE TYPE STANDARD TABLE OF SNODETEXT,
WA_NODE TYPE SNODETEXT.
**Declare Constants for TREE
CONSTANTS:
C_COL_KEY TYPE C LENGTH 1 VALUE COL_KEY,
C_COL_FIELD TYPE C LENGTH 1 VALUE COL_NORMAL,
C_COL_MATNR TYPE C LENGTH 1 VALUE COL_KEY,
C_COL_MAKTX TYPE C LENGTH 1 VALUE COL_POSITIVE.
**Selection Screen
select-options: s_objid for wa_hrp1001-objid.
START-OF-SELECTION.
**Get Data From Tables
SELECT OBJID SOBID FROM HRP1001 INTO TABLE IT_HRP1001 WHERE OBJID IN S_OBJID and SUBTY = 'B030'.
loop at it_hrp1001 assigning <fs1001>.
<fs1001>-objid1 = <fs1001>-sobid.
endloop.
SELECT OBJID SOBID FROM HRP1001 INTO TABLE IT_HRP1002 FOR ALL ENTRIES IN IT_HRP1001 WHERE OBJID = IT_HRP1001-OBJID1 and SUBTY = 'B030'.
loop at it_hrp1002 assigning <fs1002>.
<fs1002>-objid1 = <fs1002>-sobid.
endloop.
SELECT OBJID SOBID FROM HRP1001 INTO TABLE IT_HRP1003 FOR ALL ENTRIES IN IT_HRP1002 WHERE OBJID = IT_HRP1002-OBJID1 and SUBTY = 'B030'.
loop at it_hrp1003 assigning <fs1003>.
<fs1003>-objid1 = <fs1003>-sobid.
endloop.
"Первый уровень
WA_NODE-TLEVEL = 1.
WA_NODE-NAME = 'Каталог'.
WA_NODE-NLENGTH = 20.
WA_NODE-COLOR = C_COL_KEY.
WA_NODE-TEXT = 'Тексты'.
WA_NODE-TLENGTH = 50.
APPEND WA_NODE TO IT_NODE.
LOOP AT IT_HRP1001 INTO WA_HRP1001.
CLEAR WA_NODE.
WA_NODE-TLEVEL = 2. "Второй уровень
WA_NODE-NAME = WA_HRP1001-SOBID.
WA_NODE-NLENGTH = 18.
WA_NODE-COLOR = C_COL_MATNR.
APPEND WA_NODE TO IT_NODE.
LOOP AT IT_HRP1002 INTO WA_HRP1002 WHERE OBJID = WA_HRP1001-OBJID1.
CLEAR WA_NODE.
WA_NODE-TLEVEL = 3. "Третий уровень
WA_NODE-NAME = WA_HRP1002-SOBID.
WA_NODE-NLENGTH = 18.
WA_NODE-COLOR = C_COL_MAKTX.
APPEND WA_NODE TO IT_NODE.
LOOP AT IT_HRP1003 INTO WA_HRP1003 WHERE OBJID = WA_HRP1002-OBJID1.
CLEAR WA_NODE.
WA_NODE-TLEVEL = 4. "Четвертый уровень
WA_NODE-NAME = WA_HRP1003-SOBID.
WA_NODE-NLENGTH = 18.
WA_NODE-COLOR = C_COL_MAKTX.
APPEND WA_NODE TO IT_NODE.
ENDLOOP.
ENDLOOP.
ENDLOOP.
**Конструируем дерево
CALL FUNCTION 'RS_TREE_CONSTRUCT'
* EXPORTING
* INSERT_ID = '000000'
* RELATIONSHIP = ' '
* LOG =
TABLES
NODETAB = IT_NODE
EXCEPTIONS
TREE_FAILURE = 1
ID_NOT_FOUND = 2
WRONG_RELATIONSHIP = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
WRITE 'Error in Tree Construction'.
ENDIF.
**Выводим дерево на экран
CALL FUNCTION 'RS_TREE_LIST_DISPLAY'
EXPORTING
CALLBACK_PROGRAM = SY-REPID.
Программа рисует дерево объектов по таблице HRP1001. Строка в HRP1001 состоит из полей OBJID (родитель) - > SOBID(потомок). Поскольку у меня 3 цикла - у дерева строится 3 уровня. Но таких уровней там очень много. Я так понимаю, что нужна рекурсия. Подскажите пожалуйста как избавиться от циклов и переписать этот алгоритм рекурсивно.