变长表在实际应用中,通常需要对其控制表的长度的变量进行操作。以下结合一个具体的例子,反映变长表在实际中通常是如何应用的。
设有一张旧表,包含了一组课程名称。表的定义及初始化数据如下。
01 COURSE-DATA.
05 FILLER PIC X(5) VALUE ‘C’.
05 PIC X(5) VALUE ‘C++’.
05 PIC X(5) VALUE ‘JAVA’.
05 PIC X(5) VALUE ‘COBOL’.
05 PIC X(5) VALUE ‘JCL’.
05 PIC X(5) VALUE ‘DB2’.
05 PIC X(5) VALUE ‘CICS’.
01 OLD-COURSE-TABLE REDEFINES COURSE-DATA.
05 OLD-COURSES PIC X(5) OCCURS 7 TIMES.
若目前只知道该旧表中的程序设计语言类课程是从第一条数据项开始连续排列的。并且,最后一门程序设计语言课程为COBOL。整张表共包含7门课程。现要建立一张新表,新表中只包含程序设计语言类课程。
由于这里并不知道新表的实际长度,因此需要将新表定义为变长表。该变长表的长度最小为1,最大为7。当长度为1时表示旧表中只含有COBOL这一门程序设计语言课程。当长度为7时,表示旧表中所有课程都为程序设计语言类课程。定义的代码如下。
01 NEW-COURSE-TABLE.
05 NEW-COURSES PIC X(5) OCCURS 0 TO 7 TIMES
DEPENDING ON NEW-LENGTH.
05 NEW-LENGTH PIC 9.
定义完成后,再通过PERFORM VARYING语句将需要保存的数据依次放入新表之中。此外,由于题目中已说明“COBOL”为最后一条记录。因此,当数据读到COBOL,或已经达到表中数据量最大值时,该语句应该停止。实现以上功能的代码如下。
MOVE ‘N’ TO END-FLAG.
PERFORM 100-MOVE-STATE.
VARYING NEW-LENGTH FROM 1 BY 1
UNTIL END-FLAG = ‘Y’
OR NEW-LENGTH > 7.
……
100-MOVE-STATE.
MOVE OLD-COURSES (NEW-LENGTH) TO NEW-COURSES (NEW-LENGTH).
IF NEW-COURSES (NEW-LENGTH) = ‘COBOL’
MOVE ‘Y’ TO END-FLAG.
END-IF.
以上代码完成了题目的要求。代码执行后,生成的新表中的各数据内容如下。
q NEW-COURSES (1) :C
q NEW-COURSES (2) :C++
q NEW-COURSES (3):JAVA
q NEW-COURSES (4):COBOL
此外,NEW-LENGTH变量包含数字4,表示该新表的长度。