Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 10 День 10 Управляющие операторы 2011.doc
Скачиваний:
7
Добавлен:
20.11.2019
Размер:
316.42 Кб
Скачать

Преобразование литералов во время сравнений

Описание

Тип данных

Числа, содержащие от 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'.