Текущее время: Вт, дек 18 2018, 20:49

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


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


ВНИМАНИЕ!

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



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

Зарегистрирован:
Вт, апр 24 2018, 13:54
Сообщения: 3
Всем привет. Имеется программа:
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, 23:31, всего редактировалось 2 раз(а).

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

Зарегистрирован:
Пн, мар 12 2012, 10:38
Сообщения: 142
Как-нибудь так?
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 + 4 часа


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

Сейчас этот форум просматривают: BingBot


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

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