Специальные операторы для символьных строк
Использование elseif
Преобразование литералов во время сравнений
Описание | Тип данных |
Числа, содержащие от 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, чем вложение операторов 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 игнорируют конечные пробелы и не чувствительны к регистру.
Вы можете использовать переменные, константы, или литералы с операторами отношения для строк символов.
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.