SAPфорум.RU
https://sapboard.ru/forum/

Loop using key порядок обработки записей
https://sapboard.ru/forum/viewtopic.php?f=13&t=96876
Страница 1 из 1

Автор:  Sam Stone [ Чт, сен 20 2018, 14:01 ]
Заголовок сообщения:  Loop using key порядок обработки записей

Добрый день.

Код и результат ниже. Не могу найти, где объясняется, почему при использовании ключа записи обрабатываются в обратном порядке.
Code:
REPORT.

TYPES:BEGIN OF line_ty,
        id TYPE i,
        parent TYPE i,
        priority TYPE i,
        text TYPE string,
      END OF line_ty.
TYPES table_ty TYPE STANDARD TABLE OF line_ty WITH EMPTY KEY
                                              WITH NON-UNIQUE SORTED KEY parent COMPONENTS parent.

DATA lt TYPE table_ty.

lt = VALUE #( ( id = 1 parent = 0 text = 'HeaderA' )
              ( id = 2 parent = 0 text = 'HeaderB' )
              ( id = 3 parent = 0 text = 'HeaderC' )
              ( id = 4 parent = 0 text = 'HeaderD' )
              ( id = 5 parent = 1 text = 'A' )
              ( id = 6 parent = 1 priority = 1 text = 'B' )
              ( id = 7 parent = 1 priority = 2 text = 'C' )
              ( id = 8 parent = 2 text = 'D' )
              ( id = 9 parent = 3 text = 'E' )
              ( id = 10 parent = 2 text = 'F' )
              ( id = 11 parent = 3 text = 'G' )
            ).
SORT lt BY id parent priority.
ULINE.
LOOP AT lt INTO DATA(ls) USING KEY parent WHERE parent = 0.
  WRITE:/ ls-id, ls-text.
ENDLOOP.
ULINE.
LOOP AT lt INTO ls WHERE parent = 0.
  WRITE:/ ls-id, ls-text.
ENDLOOP.
ULINE.

Code:
__________________________
         4  HeaderD
         3  HeaderC
         2  HeaderB
         1  HeaderA
__________________________
         1  HeaderA
         2  HeaderB
         3  HeaderC
         4  HeaderD
__________________________

Автор:  LKU [ Чт, сен 20 2018, 14:36 ]
Заголовок сообщения:  Re: Loop using key порядок обработки записей

Ну, вы же написали конструкцию LOOP AT USING KEY, используя ключ, в котором только один компонент (Parent).
Значит, порядок обхода записей с иcпользованием этого ключа внутри одинакового значения parent в общем случае не детерминирован.

Если хотите обойти строки таблицы с Parent = 0 строго с возрастанием по порядку id, у вас аж два варианта:
1. В ключ parent добавить второй компонент ID
2. Найти первую строку в сортированной таблице с Parent = 0 с использованием binary search и далее с найденного sy-tabix крутить обычный loop, без using key, пока parent не поменяется

Автор:  ghost [ Чт, сен 20 2018, 17:41 ]
Заголовок сообщения:  Re: Loop using key порядок обработки записей  Тема решена

Duplicate Non-Unique Keys

Автор:  Sam Stone [ Пт, сен 21 2018, 08:40 ]
Заголовок сообщения:  Re: Loop using key порядок обработки записей

То, что надо!

Цитата:
If there are already one or more duplicates in the target table, the source block duplicates are inserted in their original order in front of the first duplicate in the target table.

То есть поведение фиксировано. Спасибо. :pivo:

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/