Поиск…


замечания

При переходе по внутренним таблицам обычно предпочтительнее использовать ASSIGN для символа поля, а не для цикла INTO в рабочей области. Присвоение символов поля просто обновляет их ссылку, чтобы указать на следующую строку внутренней таблицы во время каждой итерации, тогда как использование INTO приводит к тому, что строка таблицы будет скопирована в рабочую область, что может быть дорогостоящим для таблиц с длинными / большими.

Внутренний стол

LOOP AT itab INTO wa.
ENDLOOP.

FIELD-SYMBOLS <fs> LIKE LINE OF itab.
LOOP AT itab ASSIGNING <fs>.
ENDLOOP.

LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>).
ENDLOOP.

LOOP AT itab REFERENCE INTO dref.
ENDLOOP.

LOOP AT itab TRANSPORTING NO FIELDS.
ENDLOOP.

Условный цикл

Если в цикл должны быть взяты только строки, соответствующие определенному условию, добавление WHERE может быть добавлено.

LOOP AT itab INTO wa WHERE f1 = 'Max'.
ENDLOOP.

Пока цикл

ABAP также предлагает обычный WHILE -Loop, который выполняется до тех пор, пока данное выражение не станет равно false. Системный sy-index будет увеличен для каждого шага цикла.

WHILE condition.
* do something
ENDWHILE 

Do Loop

Без какого-либо дополнения DO -Loop работает бесконечно или, по крайней мере, до тех пор, пока он не будет явно удален изнутри. Системный sy-index будет увеличен для каждого шага цикла.

DO.
* do something... get it?
* call EXIT somewhere
ENDDO.

Добавление TIMES предлагает очень удобный способ повторить код ( amount представляет значение типа i ).

DO amount TIMES.
* do several times
ENDDO.

Общие команды

Чтобы разбить петли, можно использовать команду EXIT .

DO.
    READ TABLE itab INDEX sy-index INTO DATA(wa).
    IF sy-subrc <> 0.
        EXIT. "Stop this loop if no element was found
    ENDIF.    
    " some code
ENDDO.

Чтобы перейти к следующему шагу цикла, можно использовать команду CONTINUE .

DO.
    IF sy-index MOD 1 = 0.
        CONTINUE. " continue to next even index
    ENDIF.
    " some code  
ENDDO.

CHECK является CONTINUE с условием. Если условие окажется ложным , будет выполнено CONTINUE . Другими словами: цикл будет выполняться только с шагом, если условие истинно .

Этот пример CHECK ...

DO.
    " some code
    CHECK sy-index < 10.        
    " some code
ENDDO.

... эквивалентно ...

DO.
    " some code
    IF sy-index >= 10.
        CONTINUE.
    ENDIF.
    " some code
ENDDO.


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow