Пример
Пример использования VARYING
Пример использования VARYING
Использование дополнения varying
Пример зацикливания
Завершение Зацикливания
Пример зацикливания.
report ztx1008.
do.
write sy-index.
if sy-index = 0.
exit.
endif.
enddo.
Если Вы выполните эту программу, то эта программа будет выполняться бесконечно. Окончание задачи SAPGUI или даже перезагрузки не будет прерывать программу, потому что она работает на сервере приложений, а не на Вашем PC. Если Вы перезагрузитесь и затем войдете снова, то Вы не будете в состоянии даже редактировать эту программу. Ваш сеанс входа в систему находится все еще "там" на сервере приложений, и у него все еще будет блокировка на Вашем исходном тексте. Приблизительно после пяти или десяти минут после входа в систему, Вы сможете редактировать Ваш исходный текст еще раз. Однако, программа могла все еще работать в процессе работы, который замедляет систему. В конечном счете, Ваша программа будет потреблять максимальное количество центрального процессора, позволенного в Вашей конфигурации, и процесс работы перезапустит себя.
Чтобы закончить зацикливание, у Вас должно быть по крайней мере два сеанса. Вы должны запустить их прежде, чем выполнить такую программу. Если Вы находитесь в бесконечном цикле и не имеете другого сеанса работы, при повторном входе программ будет продолжать работать.
Дополнение varying (изменяющееся), используется, чтобы последовательно получать компоненты Field String. next устанавливает расстояние (в байтах) между двумя компонентами в итерации. Компонент получения устанавливает число байтов, которое должно быть прочитано из каждого компонента.
report ztx1009.
data: f1,
begin of s,
c1 value 'A',
c2 value 'B',
c3 value 'C',
c4 value 'D',
c5 value 'E',
c6 value 'F',
end of s.
write / ''.
do 6 times varying f1 from s-c1 next s-c2.
write f1.
enddo.
write / ''.
do 3 times varying f1 from s-c1 next s-c3.
write f1.
enddo.
A B C D E F
A C E
report ztx1010.
data: f1 type i,
f2 type i,
tot1 type i,
tot2 type i,
begin of s,
c1 type i value 1,
c2 type i value 2,
c3 type i value 3,
c4 type i value 4,
c5 type i value 5,
c6 type i value 6,
end of s.
do 3 times varying f1 from s-c1 next s-c3
varying f2 from s-c2 next s-c4.
write: / f1, f2.
add: f1 TO tot1,
f2 to tot2.
enddo.
write: / '---------- -----------',
/ tot1, tot2.
1 2
3 4
5 6
---------- -----------
9 12
Изменение значений в пределах do... varying/enddo
Вы можете изменить значение или f1 или s в пределах цикла... varying/enddo. Когда выполняется оператор enddo, текущее значение f1 копируется назад в компонент, из которого оно взято, в независимости от того, было ли оно изменено или нет.
report ztx1011.
data: f1 type i,
begin of s,
c1 type i value 1,
c2 type i value 2,
c3 type i value 3,
c4 type i value 4,
c5 type i value 5,
c6 type i value 6,
end of s.
field-symbols <f>.
write / ''.
do 6 times varying f1 from s-c1 next s-c2.
if sy-index = 6.
s-c6 = 99.
else.
f1 = f1 * 2.
endif.
"assign component sy-index of structure s to <f>. "<f> now points to
write <f>. "a component of s
enddo.
write / ''.
do 6 times varying f1 from s-c1 next s-c2.
write f1.
enddo.
1 2 3 4 5 99
2 4 6 8 10 6
Оператор exit внутри цикла не будет препятствовать тому, чтобы не изменялись значения f1.
Синтаксис оператора while.
while exp [ vary f1 from s-c1 next s-c2 [ vary f2 from s2-c1 next s2-c2... ]
---
[ exit. ]
---
endwhile.
где:
- exp – логическое выражение.
- s – Field String, имеющая компоненты c1 и c2.
- f1 – переменная. Компоненты s должны иметь возможность быть преобразованными к типу данных и длине f1.
- ... представляет любое число vary выражений.
- --- представляет любое число строк программы.
Особенности использования:
- while могут быть вложены бесконечное число раз и находиться внутри других циклов.
- exit предотвращает дальнейшую обработку цикла и выходит немедленно из текущего цикла. Управлние передается оператору, следующему после endwhile.
- Внутри цикла sy-index содержит текущее число итераций цикла. После endwhile,
sy-index содержит значение, которое до входа в цикл. При использовании вложенных while sy-index содержит число итераций цикла, в котором он используется. - endwhile всегда сохраняет измененное значение f1.
- Оператор while, содержащий логическое выражение и дополнение vary, вычисляет сначала логическое выражение.
while и do очень похожи.
* Пример программы с использованием while, которая помещает равное число черточек с обеих сторон строки.
report ztx1012.
data: l, "leading characters
t, "trailing characters
done. "done flag
parameters p(25) default ' Vendor Number'.
while done = ' ' "the expression is evaluated first
vary l from p+0 next p+1 "then vary assignments are performed
vary t from p+24 next p+23.
if l = ' ' and t = ' '.
l = t = '-'.
else.
done = 'X'.
endif.
endwhile.
write: / p.
----Vendor Number ----