Оператор while

Пример

Пример использования 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 ----


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: