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"。
查看此答案,其中包含许多指向其他答案的链接:
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"。
查看此答案,其中包含许多指向其他答案的链接: