6.7 EVALUATE语句
当你需要根据数据项的值分支到多个不同的程序段执行时,你有两种主要的方法来完成程序处理,一种是使用嵌套IF语句,另一种就是我们现在要介绍的EVALUATE语句。图6.7显示的是EVALUATE语句的语法,其中,WHEN之前的数据项,我们称之为选择主体(Selection Subject),选择主体可以有一个或多个;WHEN之后的数据项我们称之为选择目标(Selection Object),选择目标的个数必须总是与选择主体的个数一致。
ALSO短语用来将多个选择主体或多个选择目标分隔开来。每个选择目标出现的顺序必须与选择主体出现的顺序一致,并要遵守下面的规则。
● 出现在选择目标中的变量或常量必须与对应的选择主体的类型是可以比较的。
● 出现在选择目标中的Condition、True或Flase必须对应于选择主体中的条件表达式、True或Flase。
● Any可以对应于选择主体中的任何类型的数据。
图6.7 EVALUATE语句的语法
EVALUATE语句是实现CASE程序结构的最好方法,如下所示。
EVALUATE APFELAFD-HDR-TYPE WHEN 'N' PERFORM 2300-VALIDATE-HDR THRU 2300-EXIT WHEN 'H' PERFORM 2300-VALIDATE-HDR THRU 2300-EXIT WHEN 'D' PERFORM 2400-VALIDATE-DTL THRU 2400-EXIT WHEN OTHER MOVE 'N' TO W-VALID-IND DISPLAY '*APBALAV - INVALID REC TYPE' END-EVALUATE.
下面的例子说明EVALUATE语句如何对两个数据项(HOURS-WORKED和EXEMPT)操作。
EVALUATE HOURS-WORKED ALSO EXEMPT WHEN 0 ALSO ANY PERFORM NO-PAY WHEN NOT 0 ALSO "Y" PERFORM SALARIED WHEN 1 THRU 40 ALSO "N" PERFORM HOURLY-PAY WHEN NOT 1 THRU 40 ALSO "N" PERFORM OVERTIME-PAY WHEN OTHER DISPLAY HOURS-WORKED DISPLAY EXEMPT MOVE 0 TO HOURS-WORKED END-EVALUATE.
请注意PERFORM NO-PAY前面的ANY选项,ANY是系统的保留字,表示EXEMPT的任何值都满足测试条件。
图6.8显示的是两个等价的EVALUATE语句,我们想要说明的是,选择主体和选择目标必须具有相同的类型。在左边方框中的EVALUATE语句使用常数真(TRUE)作为选择主体,注意,TRUE在这里是保留字不是变量,而将几个条件名作为选择目标。在右边方框中的EVALUATE语句使用数据项ACTION-FLAG作为选择主体,而将文字常数作为选择目标。也请注意当ACTION-FLAG是“C”时,EVALUATE语句执行的是CONTINUE语句,该语句简单地继续执行紧跟在EVALUATE语句后面的语句。
WORKING-STORAGE SECTION. 01 ACTION-FLAG PIC X VALUE SPACE. 88 ACTION-YES VALUE "Y". 88 ACTION-NO VALUE "N". 88 ACTION-QUIT VALUE "Q". 88 ACTION-CONTINUE VALUE "C".
图6.8 等价的EVALUATE语句写法
下面的例子显示的是两个WHEN语句写在一起而中间没有如何执行语句的例子。如果ACTION是1或2时,即无论是第1个或第2个WHEN短语被选上,都会执行WHEN 2后面的DISPLAY语句。
EVALUATE ACTION WHEN 1 WHEN 2 DISPLAY "Action is Query or Update" WHEN 3 DISPLAY ‘Action is Create’ WHEN OTHER DISPLAY "Input again." END-EVALUATE.
COBOL规定每个EVALUATE语句中最多有256个WHEN短语和63个ALSO短语,但你会使用那么多的WHEN和ALSO在你的程序中吗?千万不要!
在EVALUATE语句中,当第1个WHEN条件满足时,执行完WHEN后面的语句后,程序就会转到END-EVALUATE后面的语句去执行。