Текущее время: Чт, мар 28 2024, 12:17

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: Замена FORM на METHOD
СообщениеДобавлено: Вт, апр 24 2018, 13:12 
Начинающий
Начинающий
Аватара пользователя

Зарегистрирован:
Вт, апр 24 2018, 12:54
Сообщения: 4
Всем привет. Имеется программа:
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 уровня. Но таких уровней там очень много. Я так понимаю, что нужна рекурсия. Подскажите пожалуйста как избавиться от циклов и переписать этот алгоритм рекурсивно.


Последний раз редактировалось carbon_credit Пт, июн 08 2018, 22:31, всего редактировалось 2 раз(а).

Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Рекурсия в HRP1001  Тема решена
СообщениеДобавлено: Сб, апр 28 2018, 08:14 
Специалист
Специалист

Зарегистрирован:
Пн, мар 12 2012, 09:38
Сообщения: 170
Как-нибудь так?
Code:
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: ls_hrp1001 type ty_hrp1001.

class lcl_tree DEFINITION.
  PUBLIC SECTION.
    METHODS: constructor,
             build_hierarchy IMPORTING iv_objid type hrp1001-objid
                                       iv_level type int4,
             get_tree RETURNING VALUE(rt_tree) type SNODETAB.
  PRIVATE SECTION.
    data: mt_tree type SNODETAB.
ENDCLASS.

class lcl_tree IMPLEMENTATION.
  method constructor.
    data: ls_NODE like LINE OF mt_tree.

*Первый уровень
    ls_NODE-TLEVEL = 1.
    ls_NODE-NAME   = 'Каталог'.
    ls_NODE-NLENGTH = 20.
    ls_NODE-COLOR = COL_KEY.
    ls_NODE-TEXT   = 'Тексты'.
    ls_NODE-TLENGTH = 50.
    APPEND ls_NODE TO mt_tree.

  endmethod.

  method build_hierarchy.
    data: lt_hrp1001 type TABLE OF ty_hrp1001,
          ls_NODE like LINE OF mt_tree,
          lv_color type c,
          lv_sobid type hrp1001-objid.

    CASE iv_level.
      WHEN 2.
        lv_color = COL_KEY.
      WHEN OTHERS.
        lv_color = COL_POSITIVE.
    ENDCASE.

    SELECT OBJID SOBID FROM HRP1001
      INTO CORRESPONDING FIELDS OF TABLE lt_hrp1001
      WHERE OBJID = iv_objid
        and SUBTY = 'B030'.

    CLEAR ls_NODE.
    ls_NODE-TLEVEL = iv_level.
    ls_NODE-NAME   = iv_objid.
    ls_NODE-NLENGTH = 18.
    ls_NODE-COLOR = lv_color.
    APPEND ls_NODE TO mt_tree.

    LOOP AT lt_hrp1001 ASSIGNING FIELD-SYMBOL(<hrp1001>).
      clear: lv_sobid.
      lv_sobid = <hrp1001>-sobid.

      IF lv_sobid IS NOT INITIAL.
        build_hierarchy( iv_objid = lv_sobid
                         iv_level = iv_level + 1 ).
      ENDIF.
    ENDLOOP.
  endmethod.

  method get_tree.
    rt_tree = mt_tree.
  ENDMETHOD.
ENDCLASS.


select-options: s_objid for ls_hrp1001-objid.

START-OF-SELECTION.
data: lo_tree_builder type ref to lcl_tree,
      it_node type SNODETAB.

create object lo_tree_builder.

LOOP AT S_OBJID ASSIGNING FIELD-SYMBOL(<objid>).
  lo_tree_builder->build_hierarchy( iv_objid = <objid>-low
                                    iv_level = 2 ).
ENDLOOP.

it_node[] = lo_tree_builder->get_tree( ).


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB