4.对INDEX文件的操作:
(1)定义:
SELECT CUSTOMER-FILE
ASSIGN TO \ ORGANIZATION IS INDEXED
RECORD KEY IS CUSTOMER-NUMBER56 ACCESS MODE IS DYNAMIC. INDEX文件中会有一个主KEY,
RECORD KEY IS CUSTOMER-NUMBER: 记录中的CUSTOMER-NUMBER就是每条记录的主KEY
(2)根据KEY得到相应记录:
例如:01 MOVE XX TO PRIMARY-KEY 02 READ FILE RECORD 03 INVALID KEY 04 DO SOMETHING.
说明:01行表示设置按照何值查找数据 02—04行表示读入一条数据。
(3)得到多条记录:
语法:01 READ file name NEXT RECORD 02 AT END do something.
说明:01行表示按照数据存储的顺序遍历数据记录 02行表示数据读完后进行的处理。
(4)使用COPY命令简化文件操作定义:
A.环境配置说明:在源程序文件下建立“Copy Library Files”目录,在该目录下建立后缀为“CBL”的
B.可以将文件属性和结构的定义配置在外部文件中,通过COPY命令将其包含到主程序里,以此简化对文件操作的定义。 例如:
A.将读入文件的属性定义在文件“SLVND01.CBL”中: 000100*-------------------------------- 000200* SLVND01.CBL
000300*-------------------------------- 000400 SELECT VENDOR-FILE 000500 ASSIGN TO \
000600 ORGANIZATION IS INDEXED
000700 RECORD KEY IS VENDOR-NUMBER 000800 ACCESS MODE IS DYNAMIC. B.将文件结构定义在文件“FDVND01.CBL”中: 000100*--------------------------------
11
000200* FDVND01.CBL
000300*-------------------------------- 000400 FD VENDOR-FILE
000500 LABEL RECORDS ARE STANDARD. 000600 01 VENDOR-RECORD.
000700 05 VENDOR-NUMBER PIC 9(5). 000800 05 VENDOR-NAME PIC X(30).
C.通过COPY命令将文件定义包含到主程序中: 000100 IDENTIFICATION DIVISION. 000200 PROGRAM-ID. VNDBLD02. 000600 ENVIRONMENT DIVISION. 000700 INPUT-OUTPUT SECTION. 000800 FILE-CONTROL. 000900
001000 COPY \001100
001200 DATA DIVISION. 001300 FILE SECTION. 001400
001500 COPY \001600
001700 WORKING-STORAGE SECTION. 001800
001900 PROCEDURE DIVISION. 002000 PROGRAM-BEGIN.
002100 OPEN OUTPUT VENDOR-FILE. 002200 CLOSE VENDOR-FILE. 002300
002400 PROGRAM-DONE. 002500 STOP RUN.
(5)增加文件记录: 01 WRITE file-record 02 INVALID KEY 03 do something
说明: 01行表示将一条记录写入文件。 02 行表示捕捉文件操作错误。
03 行表示文件操作失败将进行的处理。
(6)更新文件记录:
01 READ VENDOR-FILE RECORD 02 INVALID KEY
03 MOVE \
12
04 REWRITE VENDOR-RECORD 05 INVALID KEY
06 do something 说明: 01行表示读入一条记录
04行表示更新读入的文件记录。 05 行表示捕捉文件操作错误。
06 行表示文件操作失败将进行的处理。
(6)删除文件记录:
01 DELETE file-name RECORD 02 INVALID KEY
03 do something
说明: 01行表示删除一条文件记录。 02 行表示捕捉文件操作错误。
03 行表示文件操作失败将进行的处理。
(7) Indexed文件的打开和关闭: 01 PROGRAM-BEGIN.
02 OPEN OUTPUT/INPUT/I-O VENDOR-FILE. 03 CLOSE VENDOR-FILE
说明: 02 行表示以何种方式打开文件。
03行表示关闭已打开文件。
注意:不可使用EXTEND 方式打开Indexed文件。 5.习题:
1从文件中读入一组产品销售记录,每读入一个记录,计算出销售总额(数量X单价),循
环读入记录直到文件结束,.然后将全部产品的统计数据输出到新的文件中,数据结构同上一章的习题1。
2将上一题中的统计数据输出到IINDEX文件中,要求按照销售总额由大到小排序。
七.数据验证相关
1.利用程序实现数据验证:
使用条件判断语句:
例如: 001100 IF VENDOR-NUMBER < 10000
001200 DISPLAY
\
13
2使用UNTIL语句控制输入输出:
例如: 023700 ENTER-STATE-CODE.
023800 PERFORM ACCEPT-STATE-CODE. 023900 PERFORM RE-ACCEPT-STATE-CODE 024000 UNTIL STATE-CODE NOT = SPACE. 024100
024200 ACCEPT-STATE-CODE. 024300 DISPLAY \
024400 DISPLAY \024500 DISPLAY \
024600 \024700 DISPLAY \024800 ACCEPT STATE-CODE. 024900
025400 RE-ACCEPT-STATE-CODE.
025500 DISPLAY \025600 PERFORM ACCEPT-STATE-CODE.
说明:023900—024000行使用UNTIL语句控制用户的输入不为空格,避免了GOTO语句的使用。
3.修正被验证数据的格式:
例如:
000900 77 UPPER-ALPHA PIC X(26) VALUE 001000 \001100 77 LOWER-ALPHA PIC X(26) VALUE 001200 \
说明:定义“UPPER-ALPHA”和“LOWER-ALPHA”分别表示大写字符串和小写字符串。 032000 INSPECT INPUT-STRING
032100 CONVERTING LOWER-ALPHA 032200 TO UPPER-ALPHA.
说明:03200—03220行将一个小写字符串变为大写。
八.批量数据处理
1.TABLE的定义:
为了避免频繁进行I/O操作,引入了TABLE的定义,可以批量读入数据记录。 例如: 007000 01 TABLE-STATE-RECORD OCCURS 50 TIMES. 007100 05 TABLE-STATE-CODE PIC XX.
007200 05 TABLE-STATE-NAME PIC X(20).
14
说明:定义了“TABLE-STATE-RECORD”可以一次读入50条记录进行处理。 记录按序存储在TABLE-STATE-RECORD中,相当于数组。 2.调用TABLE中的记录:
例如: 018000 MOVE SPACE TO TABLE-STATE-RECORD(5).
018100 MOVE STATE-CODE TO TABLE-STATE-CODE(1). 018200 MOVE STATE-NAME TO TABLE-STATE-NAME(15). 018300 DISPLAY TABLE-STATE-NAME(23).
018400 MOVE TABLE-STATE-CODE(43) TO PRINT-CODE. 说明:018000—018400行实现了对TABLE中记录的操作。 3.按序排列TABLE记录。
例如:007000 01 TABLE-STATE-RECORD OCCURS 50 TIMES
007100 INDEXED BY STATE-INDEX.
007200 05 TABLE-STATE-CODE PIC XX. 007300 05 TABLE-STATE-NAME PIC X(20).
说明:007100行表示设定TABLE中默认的数据记录从STATE-INDEX开始。
注意:不可以对STATE-INDEX进行算术操作。例如:ADD, SUBTRACT, MULTIPLY, 和 DIVIDE
4.操作STATE-INDEX:
SET STATE-INDEX TO 1
说明:设置STATE-INDEX为1 SET STATE-INDEX TO A-VALUE
说明:设置STATE-INDEX为A-VALUE SET STATE-INDEX UP BY 1
说明:设置STATE-INDEX在原基础上加1。 SET STATE-INDEX UP BY NEXT-AMOUNT
说明:设置STATE-INDEX指向下一条记录 SET STATE-INDEX DOWN BY 1
说明:设置STATE-INDEX在原基础上减1 SET STATE-INDEX DOWN BY LAST-AMOUNT
说明:设置STATE-INDEX指向上一条记录 5.在TABLE中查找数据记录: 语法: 01 SEARCH table name 02 [AT END
15