Оператор выбора case

Пример использования SY-FDPOS

Таблица значений переменной 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 после каждого сравнения.

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'.

Синтаксис оператора case.

case v1.

when v2 [ or vn... ].

---

when v3 [ or vn... ].

---

[ when others.

--- ]

endcase.

где:

· v1 или v2 могут быть переменной, литералом, константой, или Field String.

· --- представляет любое число строк программы. Он может содержать пустые строки.

Особенности оператора case:

· Только операторы после первого соответствия, when выполняются.

· when others выполняется, если ни одно из предшествующих whens не соответствует.

· Если when others отсутствует и ни одно из соответствия whens не выполняется, выполняется оператора после endcase.

· Выражения не разрешены в операторе.

· Field Strings обрабатываются как переменные типа c.

Case очень похож на if/elseif. Единственное различие – то, что в каждом if/elseif, можно определить сложное выражение. В Case можно определить только единственное значение, которое будет сравниваться на равенство.


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



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