- 论坛徽章:
- 0
|
请教各种程序语言的比较
COBOL语言,又称通用商业语言,在财会工作、统计报表、计划编制、 情报检索、人事管理等数据管理及商业数据处理领域,都有着广泛的 应用。COBOL程序由4部(DIVISION)组成,而每个部又由若干节 (SECTION)组成。
(1) IDENTIFICATION DIVISION.(标识部)
(2) ENVIRONMENT DIVISION.(环境部)
(3) DATA DIVISION.(数据部)
FILE SECTION(文件节)
FD...
SD...
WORKING STORAGE SECTION. (工作存储节)
(4) PROCEDURE DIVISION.(过程部)
2000年的来临,使得以往COBOL程序在数据部中定义的6位日期型数据变量(YYMMDD)的计算、比较及排序运行结果出现了错误。具体表现如下:
1 日期型数据变量的计算
例:COMPUTE WORKING-PERIOD = CURRENT-DATE - WORK-JOINED-DATE
如果用此例来计算工龄,则2000年以后,工龄可能出现负值错误,如: 000321 - 890720 (2000年3月21日 - 1989年7月20日)。
2 两个日期型数据变量的比较
例:IF DATE1 >; DATE2 PROGRAM1 ELSE PROGRAM2
如果DATE1与DATE2的年份都是2位,那么2000年时,这两个数据变量 中的值就变为00xxxx,从而使比较结果可能出现错误。
3 SORT语句中用日期型数据变量作为关键字进行排序
例:SORT SAMPLE-FILE ON ASCENDING KEY BIRTH-DATE
INPUT PROCEDURE INP-SEC
GIVING WORKF.
此例用出生日期作关键字排序。若出生年份为2位,则到2000年后排
序结果也会出现错误。
修正这些错误的具体方法如下:
(1) 根据系统设计说明书、文件说明书阅读程序,找出程序中的日 期型数据变量。
1文件节(FD、SD)中定义的数据变量;
2工作存储节(WORKING STORAGE SECTION)中定义的数据变量;
3源程序及拷贝程序中使用的数据变量。
(2) 将原来2位年份的日期型数据变量,在工作存储节中增加一个描 述4位年份的 变量(SORT语句的日期变量则必须紧跟在文件节中的 SD之后)。
例:1 01 WORK-JOINED-DATE PIC X(06). ?
01 WORK-JOINED-DATE-2000.(增加定义,插在工作存储节中)
02 WORK-JOINED-DATE-1 PIC XX.
02 WORK-JOINED-DATE-2 PIC X(06).
2 01 DATE1
PIC 9(06). ?
01 DATE1-2000
PIC 9(0. (增加定义,插在工作存储节中)
3 01 SD SORT-FILE.
01 SORT-REC.
...
02 BIRTH-DATE
PIC 9(06).
...
?
02 BIRTH-DATE-2000 PIC 9(0.(增加定义,插在SD最后)
(3) 相应过程部(PROCEDURE DIVISION)中的对应程序如下。
例:1
* *** 公历2000年对应 START 1997.12.05 ***
(注释对应开始)
* COMPUTE WORKING-PERIOD =
CURRENT-DATE - WORK-JOINED-DATE. (原语句注释掉)
...(CURRENT-DATE对应,与下边类似)
MOVE WORK-JOINED-DATE TO WORK-JOINED-DATE-2.
IF WORK-JOINED-DATE < '300000'(年份小于30,为2000年以后年份)
MOVE '20' TO WORK-JOINED-DATE-1
ELSE (年份大于30,为1900年以后年份)
MOVE '19' TO WORK-JOINED-DATE-1.
COMPUTE WORKING-PERIOD =
CURRENT-DATE-2000 - WORK-JOINED-DATE-2000
(用对应后的日期进行计算,结果没有错误)
* *** 公历2000年对应 END 1997.12.05 ***(注释对应结束)
2
* *** 公历2000年对应START 1997.12.05 ***(注释对应开始)
*IF DATE1 >; DATE2 PROGRAM1 ELSE PROGRAM2. (原语句注释掉)
IF DATE1 〈 300000
COMPUTE DATE1-2000 = DATE1 + 20000000
(年份小于30,为2000年以后年份)
ELSE
COMPUTE DATE1-2000 = DATE1 + 19000000.
(年份大于30,为1900年以后年份)
...(DATE2 对应,与上边类似).
IF DATE1-2000 >; DATE2-2000 PROGRAM1 ELSE PROGRAM2.
(用对应后的日期进行比较,程序流程没有错误)
* *** 公历2000年对应 END 1997.12.05 ***(注释对应结束)
3
* *** 公历2000年对应START 1997.12.05 ***(注释对应开始)
*SORT SORTF ON ASCENDING KEY BIRTH-DATE(原语句注释掉)
SORT SORTF ON ASCENDING KEY BIRTH-DATE-2000
(用对应后的日期作为键值,排序结果没有错误)
* *** 公历2000年对应 END 1997.12.05 ***(注释对应结束)
INPUT PROCEDURE INP-SEC
GIVING WORKF.
...
* *** 公历2000年对应 START 1997.12.05 *** (注释对应开始)
* RELEASE SORTFR.(原语句注释掉)
IF BIRTH-DATE 〈 300000 (年份小于30,为2000年以后年份)
COMPUTE BIRTH-DATE-2000 = BIRTH-DATE + 20000000
ELSE (年份大于30,为1900年以后年份)
COMPUTE BIRTH-DATE-2000 = BIRTH-DATE + 19000000.
(在排序语句RELEASE前,将键值对应完毕)
RELEASE SORTR.
* *** 公历2000年对应 END 1997.12.05 ***(注释对应结束)
按以上方法,就可以解决COBOL语言的2000年问题。 |
|