将变量中的内容与文本进行比较?
Comparing what's in a variable to text?
我正在尝试进行一些数据验证,并尝试使用 if 语句来查看变量 ERROR-FLAG 和 RECORD-CODE 中的内容是否为 "NO" 和 "VC"。下面的示例..
MOVE "NO" TO ERROR-FLAG.
MOVE "NO" TO ERROR-FLAG2.
IF VEND-NUM = SPACES
MOVE "YES" TO ERROR-FLAG
MOVE "********" TO BC-AST-OUT
MOVE "B" TO B-ERROR-OUT
END-IF.
IF VEND-NUM IS NOT NUMERIC AND ERROR-FLAG IS NOO
MOVE "YES" TO ERROR-FLAG
MOVE "********" TO BC-AST-OUT
MOVE "C" TO C-ERROR-OUT
END-IF.
IF RECORD-CODE IS NOT VC
MOVE "YES" TO ERROR-FLAG
MOVE "**" TO A-AST-OUT
MOVE "A" TO A-ERROR-OUT
END-IF.
NOO
和 VC
在工作存储中分别定义为 "NO" 和 "VC"。我似乎无法弄清楚这一点,非常感谢任何和所有帮助!我不确定这是否重要,但读入了 VEND-NUM 和 RECORD-CODE。
Error code
176 IGYPS2074-S "NOO" was defined as a type that was invalid in this context. The statement was discarded.
Same message on line: 195 205 210 224
181 IGYPS2074-S "VC" was defined as a type that was invalid in this context. The statement was discarded.
我想让它确定 ERROR-FLAG 是否为 "NO"。如果它是 "NO" 我希望它为 if.
执行以下移动指令
在您的 IF
语句中,您正在使用 NOO
和 VC
,就好像它们是 88
级别的条件名称或您使用的 "class test"可以使用 SPECIAL-NAMES
来定义。
正如 Bruce Martin 所指出的,一种方法是在您的 IF 语句中使用 IS EQUAL TO
/IS NOT EQUAL
TO。
更清晰的方法是实际使用88。举个例子。
01 FILLER PIC X VALUE SPACE.
88 DATA-IN-ERROR VALUE "Y".
88 DATA-NOT-IN-ERROR VALUE "N".
SET DATA-NOT-IN-ERROR TO TRUE
IF VEND-NUM = SPACES
SET DATA-IN-ERROR TO TRUE
MOVE "********" TO BC-AST-OUT
MOVE "B" TO B-ERROR-OUT
END-IF
IF VEND-NUM IS NOT NUMERIC
AND DATA-NOT-IN-ERROR
...
END-IF
这些名称是为了说明这一点,可以根据您的情况进行改进。
更完整的示例:
05 RECORD-CODE PIC XX.
88 RECORD-CODE-IS-VC VALUE "VC".
...
01 FILLER PIC X.
88 ERROR-FOUND VALUE "Y".
88 ERROR-FOUND-FALSE VALUE "N".
SET FIRST-ERROR-FOUND-FALSE TO TRUE
IF VEND-NUM = SPACES
SET FIRST-ERROR-FOUND TO TRUE
MOVE "********" TO BC-AST-OUT
MOVE "B" TO B-ERROR-OUT
END-IF
IF VEND-NUM IS NOT NUMERIC
AND FIRST-ERROR-FOUND-FALSE
SET ERROR-FOUND TO TRUE
MOVE "********" TO BC-AST-OUT
MOVE "C" TO C-ERROR-OUT
END-IF
IF NOT RECORD-CODE-IS-VC
SET ERROR-FOUND TO TRUE
MOVE "**" TO A-AST-OUT
MOVE "A" TO A-ERROR-OUT
END-IF
进一步修改:
EVALUATE TRUE
WHEN VEND-NUM = SPACES
MOVE "********" TO BC-AST-OUT
MOVE "B" TO B-ERROR-OUT
WHEN VEND-NUM NOT NUMERIC
MOVE "********" TO BC-AST-OUT
MOVE "C" TO B-ERROR-OUT
WHEN NOT RECORD-CODE-IS-VC
MOVE "**" TO A-AST-OUT
MOVE "A" TO A-ERROR-OUT
END-EVALUATE
如果您需要其他地方的错误代码,只需插入 SET 语句即可。
您将 NOO 当作 CLASS 使用。我将跳过这里的 CLASS(但是 NUMERIC 是 CLASS,它重新组合数值“0、1、2、3、4、5、6、7、8、9”,例如) .我将只解释如何编译您的代码并使其更易于阅读和理解。
"ERROR-FLAG"和"NOO"我给你一个解决方案,"RECORD-CODE"和"VC"也是一样的。
此处要测试"ERROR-FLAG"的值是否等于"NOO"。在 COBOL 中你可以直接写:
IF VEND-NUM IS NOT NUMERIC AND ERROR-FLAG IS EQUAL TO NOO
此外,这样阅读起来可能更容易:
IF VEND-NUM IS NOT NUMERIC AND ERROR-FLAG = NOO
这完全一样。
为了使您的代码更易于维护,我强烈建议您使用这样的括号:
IF (VEND-NUM IS NOT NUMERIC) AND (ERROR-FLAG = NOO)
最后,COBOL 给了你一个很棒的工具:88 级声明。在您的情况下,您可以像这样在 ERROR-FLAG 上声明一个 88 级值:
01 ERROR-FLAG PIC X(02).
88 ERROR-FLAG-NOO value 'NO'.
在这种情况下,当 "ERROR-FLAG" 包含值 "NO" 时,则 ERROR-FLAG-NOO 为真(它的作用类似于布尔值)。
您的 IF 语句可以是:
IF (VEND-NUM IS NOT NUMERIC) AND (ERROR-FLAG-NOO)
这是第一步:能够编译您的程序并通过 88 级值使其更容易理解。第二次,您可以使用 EVALUATE 语句。在您的第二个 IF 语句中,您正在测试 ERROR-FLAG 是否为 "NO" 因为如果第一个不正确,您不想进行第二个测试。你可以这样做:
EVALUTE TRUE
WHEN VEND-NUM = SPACES
...
WHEN VEND-NUM IS NOT NUMERIC
...
WHEN RECORD-CODE NOT = VC
...
WHEN OTHER
...
END-EVALUATE
在这种情况下,如果第一个 WHEN 为真,则将执行 when 之后的代码(我写的“...”)。下面的 WHEN 将不会被测试,EVALUATE 语句将转到 "END-EVALUATE"。如果第一个 WHEN 语句为假,则将测试第二个 WHEN 语句。等等。如果所有 WHEN 语句都为假,则 "WHEN OTHER" 语句将始终执行。您可以在 Internet 上很容易地找到有关 EVALUATE 语句的文档。
我正在尝试进行一些数据验证,并尝试使用 if 语句来查看变量 ERROR-FLAG 和 RECORD-CODE 中的内容是否为 "NO" 和 "VC"。下面的示例..
MOVE "NO" TO ERROR-FLAG.
MOVE "NO" TO ERROR-FLAG2.
IF VEND-NUM = SPACES
MOVE "YES" TO ERROR-FLAG
MOVE "********" TO BC-AST-OUT
MOVE "B" TO B-ERROR-OUT
END-IF.
IF VEND-NUM IS NOT NUMERIC AND ERROR-FLAG IS NOO
MOVE "YES" TO ERROR-FLAG
MOVE "********" TO BC-AST-OUT
MOVE "C" TO C-ERROR-OUT
END-IF.
IF RECORD-CODE IS NOT VC
MOVE "YES" TO ERROR-FLAG
MOVE "**" TO A-AST-OUT
MOVE "A" TO A-ERROR-OUT
END-IF.
NOO
和 VC
在工作存储中分别定义为 "NO" 和 "VC"。我似乎无法弄清楚这一点,非常感谢任何和所有帮助!我不确定这是否重要,但读入了 VEND-NUM 和 RECORD-CODE。
Error code
176 IGYPS2074-S "NOO" was defined as a type that was invalid in this context. The statement was discarded.
Same message on line: 195 205 210 224
181 IGYPS2074-S "VC" was defined as a type that was invalid in this context. The statement was discarded.
我想让它确定 ERROR-FLAG 是否为 "NO"。如果它是 "NO" 我希望它为 if.
执行以下移动指令在您的 IF
语句中,您正在使用 NOO
和 VC
,就好像它们是 88
级别的条件名称或您使用的 "class test"可以使用 SPECIAL-NAMES
来定义。
正如 Bruce Martin 所指出的,一种方法是在您的 IF 语句中使用 IS EQUAL TO
/IS NOT EQUAL
TO。
更清晰的方法是实际使用88。举个例子。
01 FILLER PIC X VALUE SPACE.
88 DATA-IN-ERROR VALUE "Y".
88 DATA-NOT-IN-ERROR VALUE "N".
SET DATA-NOT-IN-ERROR TO TRUE
IF VEND-NUM = SPACES
SET DATA-IN-ERROR TO TRUE
MOVE "********" TO BC-AST-OUT
MOVE "B" TO B-ERROR-OUT
END-IF
IF VEND-NUM IS NOT NUMERIC
AND DATA-NOT-IN-ERROR
...
END-IF
这些名称是为了说明这一点,可以根据您的情况进行改进。
更完整的示例:
05 RECORD-CODE PIC XX.
88 RECORD-CODE-IS-VC VALUE "VC".
...
01 FILLER PIC X.
88 ERROR-FOUND VALUE "Y".
88 ERROR-FOUND-FALSE VALUE "N".
SET FIRST-ERROR-FOUND-FALSE TO TRUE
IF VEND-NUM = SPACES
SET FIRST-ERROR-FOUND TO TRUE
MOVE "********" TO BC-AST-OUT
MOVE "B" TO B-ERROR-OUT
END-IF
IF VEND-NUM IS NOT NUMERIC
AND FIRST-ERROR-FOUND-FALSE
SET ERROR-FOUND TO TRUE
MOVE "********" TO BC-AST-OUT
MOVE "C" TO C-ERROR-OUT
END-IF
IF NOT RECORD-CODE-IS-VC
SET ERROR-FOUND TO TRUE
MOVE "**" TO A-AST-OUT
MOVE "A" TO A-ERROR-OUT
END-IF
进一步修改:
EVALUATE TRUE
WHEN VEND-NUM = SPACES
MOVE "********" TO BC-AST-OUT
MOVE "B" TO B-ERROR-OUT
WHEN VEND-NUM NOT NUMERIC
MOVE "********" TO BC-AST-OUT
MOVE "C" TO B-ERROR-OUT
WHEN NOT RECORD-CODE-IS-VC
MOVE "**" TO A-AST-OUT
MOVE "A" TO A-ERROR-OUT
END-EVALUATE
如果您需要其他地方的错误代码,只需插入 SET 语句即可。
您将 NOO 当作 CLASS 使用。我将跳过这里的 CLASS(但是 NUMERIC 是 CLASS,它重新组合数值“0、1、2、3、4、5、6、7、8、9”,例如) .我将只解释如何编译您的代码并使其更易于阅读和理解。
"ERROR-FLAG"和"NOO"我给你一个解决方案,"RECORD-CODE"和"VC"也是一样的。
此处要测试"ERROR-FLAG"的值是否等于"NOO"。在 COBOL 中你可以直接写:
IF VEND-NUM IS NOT NUMERIC AND ERROR-FLAG IS EQUAL TO NOO
此外,这样阅读起来可能更容易:
IF VEND-NUM IS NOT NUMERIC AND ERROR-FLAG = NOO
这完全一样。
为了使您的代码更易于维护,我强烈建议您使用这样的括号:
IF (VEND-NUM IS NOT NUMERIC) AND (ERROR-FLAG = NOO)
最后,COBOL 给了你一个很棒的工具:88 级声明。在您的情况下,您可以像这样在 ERROR-FLAG 上声明一个 88 级值:
01 ERROR-FLAG PIC X(02).
88 ERROR-FLAG-NOO value 'NO'.
在这种情况下,当 "ERROR-FLAG" 包含值 "NO" 时,则 ERROR-FLAG-NOO 为真(它的作用类似于布尔值)。
您的 IF 语句可以是:
IF (VEND-NUM IS NOT NUMERIC) AND (ERROR-FLAG-NOO)
这是第一步:能够编译您的程序并通过 88 级值使其更容易理解。第二次,您可以使用 EVALUATE 语句。在您的第二个 IF 语句中,您正在测试 ERROR-FLAG 是否为 "NO" 因为如果第一个不正确,您不想进行第二个测试。你可以这样做:
EVALUTE TRUE
WHEN VEND-NUM = SPACES
...
WHEN VEND-NUM IS NOT NUMERIC
...
WHEN RECORD-CODE NOT = VC
...
WHEN OTHER
...
END-EVALUATE
在这种情况下,如果第一个 WHEN 为真,则将执行 when 之后的代码(我写的“...”)。下面的 WHEN 将不会被测试,EVALUATE 语句将转到 "END-EVALUATE"。如果第一个 WHEN 语句为假,则将测试第二个 WHEN 语句。等等。如果所有 WHEN 语句都为假,则 "WHEN OTHER" 语句将始终执行。您可以在 Internet 上很容易地找到有关 EVALUATE 语句的文档。