IF 条件被评估为字符串比较错误
IF condition is evaluated wrong for string comparison
当您在参数中输入十二生肖时,例如“Leo”或“LEO”,输出应显示为“This user is a LEO”,但当我这样做时只显示“INVALID”一词".
有人可以帮助我,以便当我尝试输入特定单词时,它会显示为条件规定的内容吗?
这是我的代码:
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.
改为:
if zodiac = 'Capricorn''CAPRICORN'
你应该有:
if zodiac = 'Capricorn' or zodiac = 'CAPRICORN'
加上这行代码:
elseif zodiac = 'Leo''LEO'.
您正在测试变量 zodiac
是否等于两个连接的单词“Leo'LEO
”,它们之间有一个单引号。您不是在测试“Leo”或“LEO”。
相反,您应该像 Greg 所说的那样:
elseif zodiac = 'Leo' OR zodiac = 'LEO'.
如果您想了解所有可能的语法,请阅读官方ABAP documentation about Logical Expressions(NOT、OR、AND、EQUIV 等)
我可以补充一些关于你的具体算法的事情:
- 当您计算 IF...ELSEIF 链中的同一个变量时,您可以使用 CASE...WHEN construct or the Constructor Operator
SWITCH
.
- 我猜想您正试图忽略字母大小写,您可以通过使用
to_upper
or the old TRANSLATE...TO UPPER CASE
将输入更改为大写,然后仅将其与大写单词进行比较来简化您的代码。
- 您的评估也可以通过使用两个构造函数运算符中的任何一个来压缩为更短的形式
SWITCH
or COND
。
- 如果您重复文本“The user is”,您可以在变量中定义一次,然后将其连接起来,例如使用 String Template (
|...{ ... }...|
).
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.
当您在参数中输入十二生肖时,例如“Leo”或“LEO”,输出应显示为“This user is a LEO”,但当我这样做时只显示“INVALID”一词".
有人可以帮助我,以便当我尝试输入特定单词时,它会显示为条件规定的内容吗?
这是我的代码:
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.
改为:
if zodiac = 'Capricorn''CAPRICORN'
你应该有:
if zodiac = 'Capricorn' or zodiac = 'CAPRICORN'
加上这行代码:
elseif zodiac = 'Leo''LEO'.
您正在测试变量 zodiac
是否等于两个连接的单词“Leo'LEO
”,它们之间有一个单引号。您不是在测试“Leo”或“LEO”。
相反,您应该像 Greg 所说的那样:
elseif zodiac = 'Leo' OR zodiac = 'LEO'.
如果您想了解所有可能的语法,请阅读官方ABAP documentation about Logical Expressions(NOT、OR、AND、EQUIV 等)
我可以补充一些关于你的具体算法的事情:
- 当您计算 IF...ELSEIF 链中的同一个变量时,您可以使用 CASE...WHEN construct or the Constructor Operator
SWITCH
. - 我猜想您正试图忽略字母大小写,您可以通过使用
to_upper
or the oldTRANSLATE...TO UPPER CASE
将输入更改为大写,然后仅将其与大写单词进行比较来简化您的代码。 - 您的评估也可以通过使用两个构造函数运算符中的任何一个来压缩为更短的形式
SWITCH
orCOND
。 - 如果您重复文本“The user is”,您可以在变量中定义一次,然后将其连接起来,例如使用 String Template (
|...{ ... }...|
).
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.