表的基本用途是减少代码编写量,优化数据操作,便于数据查找。对于如何利用表进行数据查找,在本章后面几节中将详细讲到。对于如何通过表减少代码编写量和优化数据操作,下面将结合一个简单实例进行具体讲解。
在银行系统的应用软件中,一个类似于零存整取的系统是十分常见的。为突出本节讨论的问题,可以对此进行一个抽象模型的提取。具体做法就以最单纯的零存整取系统为基本模型,不考虑利率和税率等。并假设存取时间为一年,同时只涉及到每个月的存款额这样一个数据项。
为更好地体现出使用表机制的优势,可以将其分为不使用表和使用表这两种情况分别进行讨论。通过对比,更直观地理解表的用途。下面对这两种情况作详细介绍。
1.不使用表的情况
在不使用表的情况下,通常将得到下面这样一组数据定义。
01 ANNUAL-DEPOSIT-DATA. /*年度存款数据,是一个01级数据。*/
05 JAN-DEPOSIT PIC 9(5). /*一月份存款数据,是一个05级数据。*/
05 FEB-DEPOSIT PIC 9(5). /*二月份存款数据,是一个05级数据。*/
05 MAR-DEPOSIT PIC 9(5). /*三月份存款数据,是一个05级数据。*/
…… /*省略四月份到十一份的存款数据*/
05 DEC-DEPOSIT PIC 9(5) /*十二月份存款数据,是一个05级数据。*/
然而,这样一种定义方式在实际应用中是存在着很多不足之处的,分别列举如下。
q 在COBOL中的数据部中编写以上这段定义的完整代码就是一项费时费力,并且相当枯燥的工作。
q 以上只是假设存取时间为一年,并且只包含月存款额这样一个数据,实际中往往并不是这样的。例如某人的存取时间为十年,那么依照以上这种定义方式,就不仅仅是12条PIC语句了,而是120条PIC语句。同时,在实际操作中每个月所涉及的数据也不可能只包含存款额而已,至少还要包括一些利息额、税款等等。这样,即使存取时间仅为一年,在定义中也不只有12条PIC语句了。
q 在COBOL程序的过程部里对通过以上方式定义的数据进行处理也是件十分麻烦的事情。最常见的,比如用之前讲到的EVALUATE语句对该组数据进行处理,这时就需要对应地在其后添加12个WHEN字句来完成操作了。
2.使用表的情况
对于不使用表机制所造成的种种弊端,这里于是引入了表的机制。仔细分析表的定义,可以看到若要形成一个表,必须具备以下两个基本条件。
q 数据存储在连续空间上。
q 所有数据具有相同的数据类型(即相似数据)。
每个月的存款额是依据月份顺序来安排的,在内存中显然应该将其存储在一片连续的存储空间上。这样,该数据结构就实现了第一个条件。
对于每个月所存入的金额这样一个数据类型,月和月之间必然具有相似的属性。结合前面不使用表机制所定义的月存款额,可以看到这些数据都有着相同的数据类型——PIC 9(5)。于是,该数据结构又实现了第二个条件。
实现建立表的两个基本条件后,便可重新将以上数据定义为一个表,代码如下。
01 ANNUAL-DEPOSIT-TABLE.
05 DEPOSITS PIC 9(5)
OCCURES 12 TIMES.
代码说明。
q ANNUAL-DEPOSIT-TABLE:年度存款数据,是一个01级数据,同时也是该表的名称。
q DEPOSITS:每个月存款数据,是一个05级数据,同时也是该表的一个条目。
q OCCURES 12 TIMES:重复出现12次。
q PIC 9(5):每个月的存款数据类型,为5个单位长度的数值数据类型。
这种方式的定义,和之前没有使用表机制的定义在本质上是等同的。然而,使用该方式完成定义所需编写的代码量大大减少了,同时也方便了对所定义数据的具体操作。以上诸多不使用表机制所造成的弊端在这里都得到了很好的解决。由此可以看到,引入了表的机制后,将大大方便程序员的开发工作,同时也方便了数据处理,提高了程序运行效率。