我正在尝试进行一些数据验证,并尝试使用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
AND 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”。如果它是“否”,我希望它为if。
执行以下移动指令答案 0 :(得分:3)
在IF
语句中,您使用的是NOO
和VC
,就好像它们是88
级别条件名称或者#34;类测试"您可以使用SPECIAL-NAMES
定义。
正如Bruce Martin所指出的,一种方法是在你的IF语句中使用IS EQUAL TO
/ IS NOT EQUAL
TO。
更明确的方法是实际使用88&#39。一个例子。
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语句。
答案 1 :(得分:2)
你正在使用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为您提供了一个很棒的工具:level-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语句为false,则将测试第二个WHEN语句。等等。如果所有WHEN语句都为false,则始终执行“WHEN OTHER”语句。您可以在互联网上轻松找到有关EVALUATE语句的文档。