10 ERROR-FLAG PIC X VALUE 'N'.
88 ERROR-FOUND VALUE 'Y'.
88 ERROR-NOT-FOUND VALUE 'N'.
Run Code Online (Sandbox Code Playgroud)
如果我做:
SET ERROR-NOT-FOUND TO TRUE
Run Code Online (Sandbox Code Playgroud)
然后我做:
SET ERROR-FOUND TO TRUE
Run Code Online (Sandbox Code Playgroud)
现在,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'.
Run Code Online (Sandbox Code Playgroud)
10级数字定义了一个字节的存储空间,如字母数字,这意味着没有任何问题,它可以包含从X'00'到X'FF'的任何位值.
这两个88级别没有存储空间.
88实际上是一种为文字(或多个)文字值赋予名称的方法,但是只使它与它引用的特定字段相关联(在本例中为ERROR-FLAG).
这里ERROR-FLAG是"条件变量"(这意味着它有一个或多个88级别与之相关),88s中的每一个都是"条件名称".
如果你这样做:
SET ERROR-NOT-FOUND TO TRUE
Run Code Online (Sandbox Code Playgroud)
然后
IF ERROR-NOT-FOUND
Run Code Online (Sandbox Code Playgroud)
会是真的,而且
IF ERROR-FOUND
Run Code Online (Sandbox Code Playgroud)
不会是真的.
SET与以下相同:
MOVE "N" TO ERROR-FLAG
Run Code Online (Sandbox Code Playgroud)
IF与以下相同:
IF ERROR-FLAG EQUAL TO "N" *> for the IF ERROR-NOT-FOUND
Run Code Online (Sandbox Code Playgroud)
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'.
Run Code Online (Sandbox Code Playgroud)
当您为条件变量赋予名称时,就像您在示例中所做的那样,有人可以对其进行编码MOVE以引用它,并将值拼写错误,或者使代码分析更加困难.使用FILLER定义无法从PROCEDURE DIVISION引用的字段可防止发生这种情况.定义的数据只能通过SET和IF访问(询问值).
代码将具有:
SET ERROR-NOT-FOUND
AMOUNT-NOT-NUMERIC TO TRUE
Run Code Online (Sandbox Code Playgroud)
开始每个处理迭代(最好不依赖于VALUE,因为你必须每次都重新设置),然后确定需要标志的特定症状时的单个SET语句.
不,88可以有多个值.值"A""Q""V"THRU"Z",例如.在执行SET时,使用的值是VALUE语句中首先提到的值,在此示例中为"A".
请参阅此答案,其中包含许多其他答案的链接:https://stackoverflow.com/a/21338755/1927206