88级数

88 Level Number

10  ERROR-FLAG              PIC X VALUE 'N'.
    88  ERROR-FOUND         VALUE 'Y'.      
    88  ERROR-NOT-FOUND     VALUE 'N'.  

如果我这样做:

SET ERROR-NOT-FOUND               TO TRUE

然后我做:

SET ERROR-FOUND                   TO TRUE

现在,ERROR-FLAG、ERROR-FOUND 和 ERROR-NOT-FOUND 的值是多少?

10  ERROR-FLAG              PIC X VALUE 'N'.
    88  ERROR-FOUND         VALUE 'Y'.      
    88  ERROR-NOT-FOUND     VALUE 'N'.

10 级数字定义一个存储字节,作为字母数字,这意味着它可以毫无问题地包含从 X'00' 到 X'FF' 的任何位值。

两个88级定义无存储.

88 是一种有效地为文字(或多个)文字值命名的方法,但它只与它引用的特定字段相关联(在本例中为 ERROR-FLAG)。

这里的 ERROR-FLAG 是 "conditional variable"(这只是意味着它有一个或多个与之关联的 88 级),每个 88 都是一个 "condition-name".

如果你这样做:

SET ERROR-NOT-FOUND                   TO TRUE     

然后

IF ERROR-NOT-FOUND

将是真实的,并且

IF ERROR-FOUND

不会是真的。

SET 相同于:

MOVE "N"                              TO ERROR-FLAG

并且 IF 与:

IF ERROR-FLAG EQUAL TO "N" *> for the IF ERROR-NOT-FOUND

88 和 SET 更改其引用的字段的值的优点是记录性的,并且减少了维护。

请记住,条件名称不定义任何存储(严格来说,有与之关联的存储,但它只包含一个文字,您不能有效地访问它)。

所以 SET ERROR-NOT-FOUND TO TRUE(很好的间距,非常好)对 ERROR-NOT-FOUND 没有任何作用(可以 做任何事情),但是放置值"N" 在错误标记中。

所以 SET ERROR-FOUND TO TRUE 对 ERROR-FOUND 没有任何作用,而是将值 "Y" 放入 ERROR-FLAG。

按顺序对这两个 SET 语句进行编码只会以 ERROR-FLAG 为 "Y" 结束(第一个 SET 将是多余的)。

88 级的 SET 语句生成与 MOVE 语句相同的代码(或should/could,不知道所有编译器)。您使用 SET 是为了避免因拼写错误(或无能)而意外弄乱标志的值。

flags/switches 的更好结构是:

01  FILLER.
    10  FILLER                  PIC X.
        88  ERROR-FOUND         VALUE 'Y'.      
        88  ERROR-NOT-FOUND     VALUE 'N'.
    10  FILLER                  PIC X.
        88  AMOUNT-NUMERIC      VALUE 'Y'.      
        88  AMOUNT-NOT-NUMERIC  VALUE 'N'.

当你给条件变量一个名字时,就像你在你的例子中所做的那样,有人 可以 编码一个 MOVE 来引用它,并输入错误的值,或使代码分析更加困难。使用 FILLER 定义不能从 PROCEDURE DIVISION 引用的字段,可以防止这种情况发生。定义的数据可以只能通过SET和IF访问(查询值)。

代码将具有:

SET ERROR-NOT-FOUND     
    AMOUNT-NOT-NUMERIC                TO TRUE  

开始每次处理迭代(最好不要依赖 VALUE,因为无论如何您每次都必须重新设置),然后在识别出需要标志的特定症状时使用单独的 SET 语句。

不是,88 可以有多个值。例如,VALUE "A" "Q" "V" THRU "Z"。执行 SET 时,使用的值是 VALUE 语句中第一个提到的值,在此示例中为 "A"。

查看此答案,其中包含许多指向其他答案的链接: