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的值是什么?
答案 0 :(得分:9)
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是“条件变量”(这意味着它有一个或多个与之关联的88个级别),而88个中的每一个都是“条件名称”。
如果你这样做:
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”放在ERROR中-FLAG。
所以SET ERROR-FOUND TO TRUE
对ERROR-FOUND没有任何作用,但是将值“Y”放在ERROR-FLAG中。
按顺序编码这两个SET语句只会导致ERROR-FLAG为“Y”(第一个SET将是多余的)。
88级的SET语句生成代码相同到MOVE语句(或者应该/可能,不知道所有编译器)。你使用SET,这样你就不会通过拼写错误(或通过无能)意外地弄乱旗帜的价值。
标志/开关的更好结构是:
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可以有多个值。值“A”“Q”“V”THRU“Z”,例如。在执行SET时,使用的值是VALUE语句中首先提到的值,在此示例中为“A”。
请参阅此答案,其中包含许多其他答案的链接:https://stackoverflow.com/a/21338755/1927206