变长表是本节要讨论的重点内容。当表中数据数目不确定时,就要使用变长表。变长表中的数据数目根据程序中执行的具体情况而确定。定义变长表时,主要是通过在OCCURS语句后加上DEPENDING ON选项实现的。另外,此处的OCCURS语句后通常不再是一个具体的数字,而是一个范围大小。定义变长表最关键的语句为。
X OCCURS x1 TO x2 TIMES DEPENDING ON Y.
完整的定义方式如下。
01 VARIABLE-TABLE-ONE.
05 FIELD-ONE OCCURS 1 TO 9 TIMES
DEPENDING ON TABLE-LENGTH-ONE.
10 VARI-NUM-ONE PIC 9(5).
10 VARI-DATA-ONE PIC X(10).
05 TABLE-LENGTH-ONE PIC 9.
以上定义的变长表,表中数据条目最少为1条,最多为9条。具体的数据条目数通过整型变量TABLE-LENGTH指定。可以看到,定义变长表时关键用到以下这条语句。
此外,关于变长表的定义方式,还有以下几点需要特别注意。
1.变长表的起始长度可以从0开始
当变长表的长度为0时,该表为空表,空表不包含任何数据。空表只是定义了一个表的结构,表中数据可在程序中根据实际情况添加。该情况下的定义语句如下。
01 VARIABLE-TABLE-TWO.
05 FIELD-TWO OCCURS 0 TO 9 TIMES
DEPENDING ON TABLE-LENGTH-TWO.
10 VARI-NUM-TWO PIC 9(5).
10 VARI-DATA-TWO PIC X(10).
05 TABLE-LENGTH-TWO PIC 9.
2.变长表的终止长度必须大于起始长度
对于这一点,也就是说OCCURS语句中第2个操作数必须大于第1个操作数。例如,对于下面这段代码,就是错误的。
01 VARIABLE-TABLE-ERR1.
05 FIELD-ERR1 OCCURS 5 TO 2 TIMES ←错误。变长表的终止长度必须大于起始长度
DEPENDING ON TABLE-LENGTH-ERR1.
10 VARI-NUM-ERR1 PIC 9(5).
10 VARI-DATA-ERR1 PIC X(10).
05 TABLE-LENGTH-ERR1 PIC 9.
3.变长表DEPENDION ON选项后变量的内容必须合法
这一点也是初学者在开发过程中常常容易忽视的。如果DEPEDNING ON选项后的变量非法,程序将非正常结束。例如以下代码就是错误的。
01 VARIABLE-TABLE-ERR2.
05 FIELD-ERR2 OCCURS 1 TO 9 TIMES
DEPENDING ON TABLE-LENGTH-ERR2.
10 VARI-NUM-ERR2 PIC 9(5).
10 VARI-DATA-ERR2 PIC X(10).
05 TABLE-LENGTH-ERR2 PIC X VALUE ‘A’. ←此处错误。
以上代码中的DEPENDING ON选项后的变量为TABLE-LENGTH-ERR2。该变量用于指定该变长表的实际长度大小。然而该变量却被定义为字符型变量,内容为字符“A”,因此是错误的。
同样,下面这段代码虽然将控制变长表长度的变量定义为整型变量。但该变量所保存的内容超出了变长表长度的范围,仍然是错误的。代码如下。
01 VARIABLE-TABLE-ERR2.
05 FIELD-ERR3 OCCURS 1 TO 5 TIMES
DEPENDING ON TABLE-LENGTH-ERR3.
10 VARI-NUM-ERR3 PIC 9(5).
10 VARI-DATA-ERR3 PIC X(10).
05 TABLE-LENGTH-ERR2 PIC 9 VALUE 9. ←此处错误。
(4)OCCURS后也可只出现一个数字。
该情况下的定义代码为。
01 VARIABLE-TABLE-TWO.
05 FIELD-TWO OCCURS 9 TIMES
DEPENDING ON TABLE-LENGTH-TWO.
10 VARI-NUM-TWO PIC 9(5).
10 VARI-DATA-TWO PIC X(10).
05 TABLE-LENGTH-TWO PIC 9 VALUE 5.
由于变长表的实际长度是根据DEPENDING ON后面的变量指定的。因此,对于以上变长表,实际长度为5,而不是9。