ЕСЛИ условие вычисляется неправильно для сравнения строк

#string #abap

#строка #abap

Вопрос:

Когда вы вводите знак зодиака в параметре, например, «Лев» или «ЛЕВ», вывод должен отображаться как «Этот пользователь — ЛЕВ», но когда я это делаю, мне отображается только слово «НЕДОПУСТИМЫЙ».

Может ли кто-нибудь помочь мне, чтобы при попытке ввести определенное слово оно отображалось так, как указано в условиях?

Это мой код:

 REPORT Z_006_EXER3.
PARAMETERS zodiac(10) TYPE C.
DATA today type d.
today = sy-datum.

WRITE:/ 'Your horoscope as of today', sy-datum.
if zodiac = 'Capricorn''CAPRICORN'.
  write:/ 'The user is a capricorn'.
elseif zodiac = 'Aquarius''AQUARIUS'.
  write:/ 'The user is an Aquarius'.
elseif zodiac = 'Pisces''PISCES'.
  write:/ 'The user is a PISCES'.
elseif zodiac = 'Aries''ARIES'.
  write:/ 'The user is an ARIES'.
elseif zodiac = 'Taurus''TAURUS'.
  write:/ 'The user is a TAURUS'.
elseif zodiac = 'Gemini''GEMINI'.
  write:/ 'The user is a GEMINI'.
elseif zodiac = 'Cancer''CANCER'.
  write:/ 'The user is a CANCER'.
elseif zodiac = 'Leo''LEO'.
  write:/ 'The user is a LEO'.
elseif zodiac = 'Virgo''VIRGO'.
  write:/ 'The user is a VIRGO'.
elseif zodiac = 'Libra''LIBRA'.
  write:/ 'The user is a LIBRA'.
elseif zodiac = 'Scorpio''SCORPIO'.
  write:/ 'The user is a SCORPPIO'.
elseif zodiac = 'Sagittarius''SAGITTARIUS'.
  write:/ 'The user is a SAGITTARIUS'.
else.
  write:/ 'Invalid'.
endif.
  

Ответ №1:

С помощью этой строки кода:

 elseif zodiac = 'Leo''LEO'.
  

вы проверяете zodiac , равна ли переменная двум объединенным словам « Leo'LEO » с одной одинарной кавычкой между ними. Вы не тестируете «Leo» или «LEO».

Вместо этого вы должны сделать, как сказал Грег:

 elseif zodiac = 'Leo' OR zodiac = 'LEO'.
  

Если вы хотите знать все возможные синтаксисы, прочитайте официальную документацию ABAP о логических выражениях (NOT, OR, AND, EQUIV и т. Д.)

Я могу добавить несколько вещей о вашем конкретном алгоритме:

  • Поскольку вы оцениваете ту же переменную в вашем IF…В противном случае, если цепочка, вы можете использовать регистр…ПРИ конструировании или операторе конструктора SWITCH .
  • Поскольку я предполагаю, что вы пытаетесь игнорировать регистр букв, вы можете упростить свой код, изменив ввод на верхний регистр с помощью либо to_upper или старого TRANSLATE...TO UPPER CASE , а затем сравнив его только со словом в верхнем регистре.
  • Ваша оценка также может быть сведена к более короткой форме с помощью любого из двух операторов конструктора SWITCH или COND .
  • Если вы повторяете текст «Пользователь есть», вы можете определить его один раз в переменной и впоследствии объединить его, например, с помощью строкового шаблона ( |...{ ... }...| ) .

Пример окончательного кода с версией ABAP> = 7.40:

 DATA(zodiac_input_evaluation) = SWITCH string( to_upper( zodiac ) 
    LET intro = `The user is` IN
    WHEN 'CAPRICORN'   THEN |{ intro } a capricorn|
    WHEN 'AQUARIUS'    THEN |{ intro } an Aquarius|
    WHEN 'PISCES'      THEN |{ intro } a PISCES|
    WHEN 'ARIES'       THEN |{ intro } an ARIES|
    WHEN 'TAURUS'      THEN |{ intro } a TAURUS|
    WHEN 'GEMINI'      THEN |{ intro } a GEMINI|
    WHEN 'CANCER'      THEN |{ intro } a CANCER|
    WHEN 'LEO'         THEN |{ intro } a LEO|
    WHEN 'VIRGO'       THEN |{ intro } a VIRGO|
    WHEN 'LIBRA'       THEN |{ intro } a LIBRA|
    WHEN 'SCORPIO'     THEN |{ intro } a SCORPPIO|
    WHEN 'SAGITTARIUS' THEN |{ intro } a SAGITTARIUS|
    ELSE 'Invalid' ).
WRITE : / zodiac_input_evaluation.
  

Ответ №2:

Вместо: if zodiac = 'Capricorn''CAPRICORN' У вас должно быть: if zodiac = 'Capricorn' or zodiac = 'CAPRICORN'