88级别编号

Cod*_*man 6 cobol

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的值是什么?

Bil*_*ger 9

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