Cobol 比较什么';将变量中的s转换为文本?

Cobol 比较什么';将变量中的s转换为文本?,cobol,mainframe,Cobol,Mainframe,我正在尝试进行一些数据验证,并尝试使用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

我正在尝试进行一些数据验证,并尝试使用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”。如果它是“否”,我希望它为If执行以下移动指令。

在您的
If
语句中,您使用的是
NOO
VC
,就好像它们是
88
级别的条件名称或可以使用
特殊名称定义的“类测试”

正如Bruce Martin所指出的,一种方法是在IF语句中使用
等于
/
不等于

更清晰的方法是实际使用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语句。

If
语句中,您使用的是
NOO
VC
,就像它们是
88
级别的条件名称或可以使用
特殊名称定义的“类测试”

正如Bruce Martin所指出的,一种方法是在IF语句中使用
等于
/
不等于

更清晰的方法是实际使用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,就像它是一个类一样。我将跳过这里的类(但NUMERIC是一个重新组合数值“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)
01 ERROR-FLAG           PIC X(02).
   88 ERROR-FLAG-NOO    value 'NO'.
最后,COBOL为您提供了一个很棒的工具:88级声明。在您的情况下,可以在ERROR-FLAG上声明88级值,如下所示:

IF (VEND-NUM IS NOT NUMERIC) AND (ERROR-FLAG = NOO)
01 ERROR-FLAG           PIC X(02).
   88 ERROR-FLAG-NOO    value 'NO'.
在这种情况下,当“ERROR-FLAG”包含值“NO”时,ERROR-FLAG-NOO为true(它的工作原理类似于布尔值)

您的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为true,则将执行WHEN后面的代码(我写了“…”)。以下时间将不进行测试,EVALUATE语句将转到“END-EVALUATE”。如果第一个WHEN语句为false,则将测试第二个WHEN语句。等等如果所有WHEN语句都为false,则始终执行“WHEN OTHER”语句。您可以在internet上很容易地找到有关EVALUATE语句的文档。

您正在使用NOO,就像它是一个类一样。我将跳过这里的类(但NUMERIC是一个重新组合数值“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)
01 ERROR-FLAG           PIC X(02).
   88 ERROR-FLAG-NOO    value 'NO'.
最后,COBOL为您提供了一个很棒的工具:88级声明。在您的情况下,可以在ERROR-FLAG上声明88级值,如下所示:

IF (VEND-NUM IS NOT NUMERIC) AND (ERROR-FLAG = NOO)
01 ERROR-FLAG           PIC X(02).
   88 ERROR-FLAG-NOO    value 'NO'.
在这种情况下,当“ERROR-FLAG”包含值“NO”时,ERROR-FLAG-NOO为true(它的工作原理类似于布尔值)

您的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为true,则将执行WHEN后面的代码(我写了“…”)。以下时间将不进行测试,EVALUATE语句将转到“END-EVALUATE”。如果第一个WHEN语句为false,则将测试第二个WHEN语句。等等如果所有WHEN语句都为false,则始终执行“WHEN OTHER”语句。您可以在互联网上很容易地找到有关EVALUATE语句的文档。

到底发生了什么以及您希望发生什么???,目前问题非常广泛。错误代码`176 IGYPS2074-S“NOO”被定义为在此上下文中无效的类型。该声明被放弃。第行上的相同消息:195 205 210 224 181 IGYPS2074-S“VC”被定义为在此上下文中无效的类型。该语句被丢弃。“那么,NOO、VC、记录代码等的定义是什么?”记录代码被读入。图XX,NOO定义为“N