- •Тема 10 «Управляющие операторы»
- •Условный оператор if
- •Преобразование литералов во время сравнений
- •Использование elseif
- •Специальные операторы для символьных строк
- •Оператор выбора case
- •Оператор exit
- •Оператор do
- •Завершение Зацикливания
- •Использование дополнения varying
- •Изменение значений в пределах do ... Varying/enddo
- •Оператор while
- •Оператора continue
- •Оператор check (проверки)
- •Сравнение операторов exit, continue и check
- •Простые форматы оператора write
Преобразование литералов во время сравнений
Описание |
Тип данных |
Числа, содержащие от 1 до 9 цифр |
i |
Числа, содержащие более 10 цифр |
p |
Все другие |
c |
Преобразования типов для литералов соответствует тем же самым приоритетам и правилам преобразования.
Пример использования if
report ztx1001.
data: begin of s1,
x value 'X',
y value 'Y',
z value 'Z',
end of s1,
begin of s2,
x value 'X',
z value 'Z',
end of s2.
if s1-x = s2-x.
write: / s1-x, '=', s2-x.
else.
write: / s1-x, '<>', s2-x.
endif.
if s1-x between s2-x and s2-z.
write: / s1-X, 'is between', s2-x, 'and', s2-z.
else.
write: / s1-X, 'is not between', s2-x, 'and', s2-z.
endif.
if s1 = s2. "comparing field strings byte by byte
write: / 's1 = s2'.
else.
write: / 's1 <> s2'.
endif.
if 0 = ' '. "Watch out for this one
write: / '0 = '' '''.
else.
write: / '0 <> '' '''.
endif.
X = X
X is between X and Z
s1 <> s2
0 = ' '
Field Strings преобразовываются в переменные типа c. Поэтому s1 – XYZ, а значение s2 – XZ. Они не равны.
0 сравнивается с пробелом. Нуль сохранен внутренне как тип i, пробел как тип c. Согласно порядку очередности, тип c преобразован к типу i. Преобразование пробела к целому числу приводит к нулевому значению, и сравнение, оказывается, неожиданно истинно.
Использование elseif
Лучше использовать elseif, чем вложение операторов if.
*пример использования elseif
report ztx1002.
parameters: f1 default 'A',
f2 default 'B',
f3 default 'C'.
if f1 = f2. write: / f1, '=', f2.
elseif f1 = f3. write: / f1, '=', f3.
elseif f2 = f3. write: / f2, '=', f3.
else. write: / 'all fields are different'.
endif.
*lines 5-9 do the same as lines 14-26
if f1 = f2.
write: / f1, '=', f2.
else.
if f1 = f3.
write: / f1, '=', f3.
else.
if f2 = f3.
write: / f2, '=', f3.
else.
write: / 'all fields are different'.
endif.
endif.
endif.
all fields are different
all fields are different
Специальные операторы для символьных строк
Оператор |
Описание |
Условие истинно, если |
Чувствительность к регистру |
Конечные пробелы проигнорированны? |
v1 CO v2 |
Contains Only |
v1 составлен только из символов v2 |
Yes |
No |
v1 CN v2 |
not v1 CO v2 |
v1 содержит символы, которые не находятся в v2 |
Yes |
No |
v1 CA v2 |
Contains Any |
v1 содержит по крайней мере один символ в v2 |
Yes |
No |
v1 NA v2 |
not v1 CA v2 |
v1 не содержит символа в v2 |
Yes |
No |
v1 CS v2 |
Contains String |
v1 содержит строку символов v2 |
No |
Yes |
v1 NS v2 |
not v1 CS v2 |
v1 не содержит строку символов v2 |
No |
Yes |
v1 CP v2 |
Contains Pattern |
v1 содержит шаблон в v2 |
No |
Yes |
v1 NP v2 |
not v1 CP v2 |
v1 не содержит шаблон в v2 |
No |
Yes |
Эти операторы могут использоваться в любом выражении сравнения. Операторы CS, NS, CP и NP игнорируют конечные пробелы и не чувствительны к регистру.
Вы можете использовать переменные, константы, или литералы с операторами отношения для строк символов.
*Пример программы, содержащей CO, CN, CA, и NA
report ztx1003.
* operator: co
write / '''AABB'' co ''AB'''.
if 'AABB' co 'AB'.
write 'True'.
else.
write 'False'.
endif.
write / '''ABCD'' co ''ABC'''.
if 'ABCD' co 'ABC'.
write 'True'.
else.
write 'False'.
endif.
* operator: cn
write / '''AABB'' cn ''AB'''.
if 'AABB' cn 'AB'.
write 'True'.
else.
write 'False'.
endif.
write / '''ABCD'' cn ''ABC'''.
if 'ABCD' cn 'ABC'.
write 'True'.
else.
write 'False'.
endif.
* operator: ca
write / '''AXCZ'' ca ''AB'''.
if 'AXCZ' ca 'AB'.
write 'True'.
else.
write 'False'.
endif.
write / '''ABCD'' ca ''XYZ'''.
if 'ABCD' ca 'XYZ'.
write 'True'.
else.
write 'False'.
endif.
* operator: na
write / '''AXCZ'' na ''ABC'''.
if 'AXCZ' na 'ABC'.
write 'True'.
else.
write 'False'.
endif.
write / '''ABCD'' na ''XYZ'''.
if 'ABCD' na 'XYZ'.
write 'True'.
else.
write 'False'.
endif.
'AABB' co 'AB' True
'ABCD' co 'ABC' False
'AABB' cn 'AB' False
'ABCD' cn 'ABC' True
'AXCZ' ca 'AB' True
'ABCD' ca 'XYZ' False
'AXCZ' na 'ABC' False
'ABCD' na 'XYZ' True
Операторы CP (содержит шаблон) и NP (никакой шаблон) выполняют строковый поиск, который позволяет сопоставлять символы с образцом. Выражение v1 CP v2 является истинным, когда v1 содержит строку, которая соответствует шаблону в v2. Выражение v1 NP v2 является истинным, когда v1 не содержит строку, которая соответствует шаблону в v2. Это эквивалентно not v1 cp v2. Символы шаблона представлены в таблице:
Символ |
Использование |
* |
Соответствует любой последовательности символов. |
+ |
Соответствует любому единственному символу. |
# |
Интерпретирует следующий символ буквально (как литерал). |
Один символ после # интерпретируется буквально. Символ # используется, чтобы сделать поиск чувствительным к регистру совместно с символами *, +. Символ # необходим, когда нужно выполнить поиск с учетом регистра, используя CS, NS, CP или NP, а также если нужно выполнить поиск шаблона (CP или NP) для строки, содержащей *, +, или #.
Пример |
Результат True |
v1 CP 'A+C' |
v1 содержит "a" в первой позиции и "c" в третьей. Введенный символ может быть в верхнем или нижнем регистре. Во второй позиции может находиться любой символ. |
v1 CP '*Ab*' |
Строка "ab" находится в строке v1. Введенный символ может быть в верхнем или в нижнем регистре. |
v1 CP '*#A#b*' |
v1 содержит прописную букву А и строчную букву b. |
v1 CP '*##*' |
v1 содержит #. |
Использование этих операторов всегда устанавливает системную переменную sy-fdpos. Если результат сравнения – истина, sy-fdpos содержит отсчитываемое от нуля смещение первого соответствия или несоответствия символу. Иначе, sy-fdpos содержит длину v1. Значение, назначенное sy-fdpos каждым оператором, описано в таблице.
После сравнения sy-fdpos будет содержать или 1-ое символьное смещение или длину v1. В таблице, "1st char(v1)" означает "смещение первого символа (строки или шаблона) v1" , length (v1) означает "длину v1." Только первый столбец содержит оператор ABAP/4.
Таблица значений переменной SY-FDPOS
Сравнение |
if TRUE sy-fdpos = |
if FALSE sy-fdpos = |
v1 CO v2 |
length (v1) |
1stchar (v1) not in v2 |
v1 CN v2 |
1stchar (v1) in v2 |
length (v1) |
v1 CA v2 |
1stchar (v1) in v2 |
length (v1) |
v1 NA v2 |
length (v1) |
1stchar (v1) in v2 |
v1 CS v2 |
1stchar (v2) in v1 |
length (v1) |
v1 NS v2 |
length (v1) |
1stchar (v1) in v2 |
v1 CP v2 |
1stchar (v2) in v1 |
length (v1) |
Пример аналогичен предыдущему, но добавлены строки, чтобы отобразить значение sy-fdpos после каждого сравнения.
* Пример использования SY-FDPOS
report ztx1004.
* operator: co
write / '''AABB'' co ''AB'''.
if 'AABB' co 'AB'.
write 'True'.
else.
write 'False'.
endif.
write: 'sy-fdpos=', sy-fdpos.
write / '''ABCD'' co ''ABC'''.
if 'ABCD' co 'ABC'.
write 'True'.
else.
write 'False'.
endif.
write: 'sy-fdpos=', sy-fdpos.
* operator: cn
write / '''AABB'' cn ''AB'''.
if 'AABB' cn 'AB'.
write 'True'.
else.
write 'False'.
endif.
write: 'sy-fdpos=', sy-fdpos.
write / '''ABCD'' cn ''ABC'''.
if 'ABCD' cn 'ABC'.
write 'True'.
else.
write 'False'.
endif.
write: 'sy-fdpos=', sy-fdpos.
* operator: ca
write / '''AXCZ'' ca ''AB'''.
if 'AXCZ' ca 'AB'.
write 'True'.
else.
write 'False'.
endif.
write: 'sy-fdpos=', sy-fdpos.
write / '''ABCD'' ca ''XYZ'''.
if 'ABCD' ca 'XYZ'.
write 'True'.
else.
write 'False'.
endif.
write: 'sy-fdpos=', sy-fdpos.
* operator: na
write / '''AXCZ'' na ''ABC'''.
if 'AXCZ' na 'ABC'.
write 'True'.
else.
write 'False'.
endif.
write: 'sy-fdpos=', sy-fdpos.
write / '''ABCD'' na ''XYZ'''.
if 'ABCD' na 'XYZ'.
write 'True'.
else.
write 'False'.
endif.
write: 'sy-fdpos=', sy-fdpos.
'AABB' co 'AB' True sy-fdpos = 4
'ABCD' co 'ABC' False sy-fdpos = 3
'AABB' cn 'AB' False sy-fdpos = 4
'ABCD' cn 'ABC' True sy-fdpos = 3
'AXCZ' ca 'AB' True sy-fdpos = 0
'ABCD' ca 'XYZ' False sy-fdpos = 4
'AXCZ' na 'ABC' False sy-fdpos = 0
'ABCD' na 'XYZ' True sy-fdpos = 4
Результат сравнения истина. Поэтому, sy-fdpos содержит 4, длина первого операнда.
Результат сравнения, ложь, потому что v1 содержит значения не содержащиеся в v2. Sy-fdpos содержит 3, отсчитываемое от нуля смещение первого символа в v1, который не находится в v2.
Хотя следующие две строки являются логическими противоположностями предыдущих строк, значения sy-fdpos не изменяются.
Результат сравнения истина, потому что v1 содержит символ из v2. Sy-fdpos содержит 0: отсчитываемое от нуля смещение первого символа в v1, который находится в v2.
v1 не содержит ни одного из символов в v2, поэтому sy-fdpos содержит 4: длина v1.
Следующая строка является логическим отрицанием ca. 'AXCZ' действительно содержит значение из 'ABC' и так ca, тест был бы истиной. Отрицание этого результата дает ложь. Sy-fdpos установлен в отсчитываемое от нуля смещение первого символа в 'AXCZ', который находится также в 'ABC'.
Следующая строка является, снова, логическим отрицанием ca. 'ABCD' не содержит значение от 'XYZ' и так ca тест был ложью. Отрицание этого результата приводит к истине. Sy-fdpos установлен в длину 'ABCD'.