Пример программы, содержащей CO, CN, CA, и NA

Специальные операторы для символьных строк

Использование 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.


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



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