Оператор GROUP BY позволяет группировать значения в цикле по ключу. В чем-то это похоже на оператор AT NEW.
Давайте попробуем обработать записи таблицы splfi по уникальным значениям carrid. Для этого пропишем следующий код:
1 2 3 4 5 6 7 8 9 10 11 |
DATA: lt_splfi TYPE TABLE OF spfli. SELECT * FROM spfli INTO TABLE lt_splfi. LOOP AT lt_splfi INTO DATA(ls_splfi) GROUP BY ( carrid = ls_splfi-carrid size = GROUP SIZE index = GROUP INDEX ) ASCENDING REFERENCE INTO DATA(rv_group). write: / rv_group->carrid. ENDLOOP. |
Дополнения. Их можно не указывать.
SIZE - хранит количество строк в группе
INDEX - номер группы по порядку
Также можно указывать сортировку при обработке блоков ASCENDING или DECENDING. По умолчанию сортировка по возрастанию.
Результат:
Теперь попробуем обработать отдельные строки в группе. И еще изменим сортировку на DESCENDING. Выглядит так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
DATA: lt_splfi TYPE TABLE OF spfli. SELECT * FROM spfli INTO TABLE lt_splfi. LOOP AT lt_splfi INTO DATA(ls_splfi) GROUP BY ( carrid = ls_splfi-carrid size = GROUP SIZE index = GROUP INDEX ) DESCENDING REFERENCE INTO DATA(rv_group). WRITE: / 'GROUP', rv_group->carrid. LOOP AT GROUP rv_group ASSIGNING FIELD-SYMBOL(<line>). WRITE: / ' ', <line>-connid. ENDLOOP. ENDLOOP. |
Результат
Третий вариант использования. Можно не указывать дополнение REFERENCE INTO.
1 2 3 4 5 6 7 8 |
DATA: lt_splfi TYPE TABLE OF spfli. SELECT * FROM spfli INTO TABLE lt_splfi. LOOP AT lt_splfi INTO DATA(ls_splfi2) GROUP BY ( carrid = ls_splfi2-carrid ) ASCENDING . write: / ls_splfi2-carrid, ls_splfi2-connid. ENDLOOP. |
В этом случае в структуру ls_splfi2 будет попадать первая запись из группы.