大型机COBOL程序之简易报表打印

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

COBOL实验报告2
一,实验目的
1,能够利用cobol程序实现一个报表的编辑和制作。

2,能够对文件进行操作,比如说:打开,关闭,读和写 3,了解COBOL的常用语句和一些常用的数据类型,能够利用编辑型数据实现数据的友好输出。

4,能够运用sdsf修改程序中的错误
5,学会编写稍微复杂的COBOL程序。

二,实验原理和内容
1,修改UTE20.COBOL.MURACH.EXERCISE(RPT1000X) 使之正常运行。

2,在RPT1000原有基础上改进成增强的报表打印程序。

3,利用给定的数据和格式独立的制作一个报表
三,实验环境
PC机和TSO下的ISPF环境
四,实验步骤
1,步骤1和步骤2:修改
UTE20.COBOL.MURACH.EXERCISE(RPT1000X) 使之正常运行,并在此基础上改进成增强型的报表打印程序。

1.1 代码:
000100 IDENTIFICATION DIVISION.
000200
000300 PROGRAM-ID. RPT1000.
000400
000500 ENVIRONMENT DIVISION.
000600
000700 INPUT-OUTPUT SECTION.
000800
000900 FILE-CONTROL.
001000
001100 SELECT CUSTMAST ASSIGN TO CUSTMAST.
001200 SELECT SALESRPT ASSIGN TO SALESRPT.
001300
001400 DATA DIVISION.
001500
001600 FILE SECTION.
001700
001800 FD CUSTMAST.
001900
002000 01 CUSTOMER-MASTER-RECORD.
002100 05 CM-BRANCH-NUMBER PIC 9(2).
002200 05 CM-SALESREP-NUMBER PIC 9(2).
002300 05 CM-CUSTOMER-NUMBER PIC 9(5).
002400 05 CM-CUSTOMER-NAME PIC X(20).
002500 05 CM-SALES-THIS-YTD PIC S9(5)V9(2).
002600 05 CM-SALES-LAST-YTD PIC S9(5)V9(2).
002700
002800 FD SALESRPT.
002900
003000 01 PRINT-AREA PIC X(132).
003100
003200 WORKING-STORAGE SECTION.
003300
003400 01 SWITCHES.
003500 05 CUSTMAST-EOF-SWITCH PIC X VALUE "N".
003600
003700 01 PRINT-FIELDS.
003800 05 PAGE-COUNT PIC S9(3) V ALUE ZERO.
003900 05 LINES-ON-PAGE PIC S9(3) V ALUE +55.
004000 05 LINE-COUNT PIC S9(3) V ALUE +99.
004100 05 SPACE-CONTROL PIC S9.
004200
004300 01 TOTAL-FIELDS.
004400 05 GRAND-TOTAL-THIS-YTD PIC S9(7)V99 VALUE ZERO.
004500 05 GRAND-TOTAL-LAST-YTD PIC S9(7)V99 VALUE ZERO.
004600
01 CALCULATED-FILEDS.
05 CHANGE-AMOUNT PIC S9(5)V99.
004700 01 CURRENT-DATE-AND-TIME.
004800 05 CD-YEAR PIC 9999.
004900 05 CD-MONTH PIC 99.
005000 05 CD-DAY PIC 99.
005100 05 CD-HOURS PIC 99.
005200 05 CD-MINUTES PIC 99.
005300 05 FILLER PIC X(9).
005400
005500 01 HEADING-LINE-1.
005600 05 FILLER PIC X(7) VALUE "DA TE: ".
005700 05 HL1-MONTH PIC 9(2).
005800 05 FILLER PIC X(1) VALUE "/".
005900 05 HL1-DAY PIC 9(2).
006000 05 FILLER PIC X(1) VALUE "/".
006100 05 HL1-YEAR PIC 9(4).
006200 05 FILLER PIC X(11) VALUE SPACE.
006300 05 FILLER PIC X(20) V ALUE "YEAR-TO-DATE SALES R".
006400 05 FILLER PIC X(20) VALUE "EPORT ". 006500 05 FILLER PIC X(8) VALUE " PAGE: ".
006600 05 Hl1-PAGE-NUMBER PIC ZZZ9.
006700 05 FILLER PIC X(52) VALUE SPACE.
006800
006900 01 HEADING-LINE-2.
007000 05 FILLER PIC X(7) VALUE "TIME: ".
007100 05 HL2-HOURS PIC 9(2).
007200 05 FILLER PIC X(1) VALUE ":".
007300 05 HL2-MINUTES PIC 9(2).
007400 05 FILLER PIC X(58) VALUE SPACE.
007500 05 FILLER PIC X(10) VALUE "RPT1000".
007600 05 FILLER PIC X(52) VALUE SPACE.
007700
007800 01 HEADING-LINE-3.
007900 05 FILLER PIC X(20) VALUE "CUST ". 008000 05 FILLER PIC X(20) VALUE " SALES ". 008100 05 FILLER PIC X(20) VALUE " SALES ".
05 FILLER PIC X(20) VALUE "CHANGE CHANGE ". 008200 05 FILLER PIC X(52) VALUE SPACE.
008300
008400 01 HEADING-LINE-4.
008500 05 FILLER PIC X(20) VALUE "NUM CUSTOMER NAME". 008600 05 FILLER PIC X(20) VALUE " THIS YTD ". 008700 05 FILLER PIC X(20) VALUE " LAST YTD ".
05 FILLER PIC X(20) VALUE "AMOUNT PERCENT ". 008800 05 FILLER PIC X(52) VALUE SPACE.
008900
009000 01 CUSTOMER-LINE.
009100 05 CL-CUSTOMER-NUMBER PIC 9(5).
009200 05 FILLER PIC X(2) VALUE SPACE. 009300 05 CL-CUSTOMER-NAME PIC X(20).
009400 05 FILLER PIC X(3) VALUE SPACE. 009500 05 CL-SALES-THIS-YTD PIC ZZ,ZZ9.99-.
009600 05 FILLER PIC X(4) VALUE SPACE. 009700 05 CL-SALES-LAST-YTD PIC ZZ,ZZ9.99-.
05 FILLER PIC X(4) VALUE SPACE.
05 CL-CHANGE-AMOUNT PIC ZZ,ZZ9.99-.
05 FILLER PIC X(3) VALUE SPACE.
05 CL-CHANGE-PERCENT PIC ZZ9.9-.
009800 05 FILLER PIC X(55) VALUE SPACE. 009900
010000 01 GRAND-TOTAL-LINE.
010100 05 FILLER PIC X(27) VALUE SPACE. 010200 05 GTL-SALES-THIS-YTD PIC Z,ZZZ,ZZ9.99-.
010300 05 FILLER PIC X(1) VALUE SPACE. 010400 05 GTL-SALES-LAST-YTD PIC Z,ZZZ,ZZ9.99-.
05 FILLER PIC X(1) VALUE SPACE.
05 GTL-CHANGE-AMOUNT PIC Z,ZZZ,ZZ9.99-.
05 FILLER PIC X(3) VALUE SPACE.
05 GTL-CHANGE-PERCENT PIC ZZ9.9-.
010500 05 FILLER PIC X(55) VALUE SPACE. 010600
010700 PROCEDURE DIVISION.
010800
010900 000-PREPARE-SALES-REPORT.
011000
011100 OPEN INPUT CUSTMAST
011200 OUTPUT SALESRPT.
011300 PERFORM 100-FORMA T-REPORT-HEADING.
011400 PERFORM 200-PREPARE-SALES-LINES
011500 UNTIL CUSTMAST-EOF-SWITCH = "Y".
011600 PERFORM 300-PRINT-GRAND-TOTALS.
011700 CLOSE CUSTMAST
011800 SALESRPT.
011900 STOP RUN.
012000
012100 100-FORMA T-REPORT-HEADING.
012200
012300 MOVE FUNCTION CURRENT-DATE TO
CURRENT-DATE-AND-TIME.
012400 MOVE CD-MONTH TO HL1-MONTH.
012500 MOVE CD-DAY TO HL1-DAY.
012600 MOVE CD-YEAR TO HL1-YEAR.
012700 MOVE CD-HOURS TO HL2-HOURS.
012800 MOVE CD-MINUTES TO HL2-MINUTES.
012900
013000 200-PREPARE-SALES-LINES.
013100
013200 PERFORM 210-READ-CUSTOMER-RECORD.
013300 IF CUSTMAST-EOF-SWITCH = "N"
IF CM-SALES-THIS-YTD >= 10000
013400 PERFORM 220-PRINT-CUSTOMER-LINE.
013500
013600 210-READ-CUSTOMER-RECORD.
013700
013800 READ CUSTMAST
013900 A T END
014000 MOVE "Y" TO CUSTMAST-EOF-SWITCH.
014100
014200 220-PRINT-CUSTOMER-LINE.
014300
014400 IF LINE-COUNT >= LINES-ON-PAGE
014500 PERFORM 230-PRINT-HEADING-LINES.
014600 MOVE CM-CUSTOMER-NUMBER TO CL-CUSTOMER-NUMBER. 014700 MOVE CM-CUSTOMER-NAME TO CL-CUSTOMER-NAME. 014800 MOVE CM-SALES-THIS-YTD TO CL-SALES-THIS-YTD. 014900 MOVE CM-SALES-LAST-YTD TO CL-SALES-LAST-YTD.
COMPUTE CHANGE-AMOUNT =
CM-SALES-THIS-YTD - CM-SALES-LAST-YTD.
MOVE CHANGE-AMOUNT TO CL-CHANGE-AMOUNT.
IF CM-SALES-LAST-YTD = ZERO
MOVE 999.9 TO CL-CHANGE-PERCENT
ELSE
COMPUTE CL-CHANGE-PERCENT ROUNDED =
CHANGE-AMOUNT * 100 / CM-SALES-LAST-YTD
ON SIZE ERROR
MOVE 999.9 TO CL-CHANGE-PERCENT.
015000 MOVE CUSTOMER-LINE TO PRINT-AREA.
015100 WRITE PRINT-AREA AFTER ADVANCING SPACE-CONTROL LINES.
015200 ADD 1 TO LINE-COUNT.
015300 ADD CM-SALES-THIS-YTD TO GRAND-TOTAL-THIS-YTD. 015400 ADD CM-SALES-LAST-YTD TO GRAND-TOTAL-LAST-YTD. 015500 MOVE 1 TO SPACE-CONTROL.
015600
015700 230-PRINT-HEADING-LINES.
015800
015900 ADD 1 TO PAGE-COUNT.
016000 MOVE PAGE-COUNT TO HL1-PAGE-NUMBER.
016100 MOVE HEADING-LINE-1 TO PRINT-AREA.
016200 WRITE PRINT-AREA AFTER ADVANCING PAGE.
016300 MOVE HEADING-LINE-2 TO PRINT-AREA.
016400 WRITE PRINT-AREA AFTER ADVANCING 1 LINES.
016500 MOVE HEADING-LINE-3 TO PRINT-AREA.
016600 WRITE PRINT-AREA AFTER ADVANCING 2 LINES.
016700 MOVE HEADING-LINE-4 TO PRINT-AREA.
016800 WRITE PRINT-AREA AFTER ADVANCING 1 LINES.
016900 MOVE ZERO TO LINE-COUNT.
017000 MOVE 2 TO SPACE-CONTROL.
017100
017200 300-PRINT-GRAND-TOTALS.
017300
017400 MOVE GRAND-TOTAL-THIS-YTD TO GTL-SALES-THIS-YTD. 017500 MOVE GRAND-TOTAL-LAST-YTD TO GTL-SALES-LAST-YTD.
COMPUTE CHANGE-AMOUNT =
GRAND-TOTAL-THIS-YTD - GRAND-TOTAL-LAST-YTD.
MOVE CHANGE-AMOUNT TO GTL-CHANGE-AMOUNT.
IF GRAND-TOTAL-LAST-YTD = ZERO
MOVE 999.9 TO GTL-CHANGE-PERCENT
ELSE
COMPUTE GTL-CHANGE-PERCENT ROUNDED =
CHANGE-AMOUNT * 100 / GRAND-TOTAL-LAST-YTD
ON SIZE ERROR
MOVE 999.9 TO GTL-CHANGE-PERCENT 017600 MOVE GRAND-TOTAL-LINE TO PRINT-AREA. 017700 WRITE PRINT-AREA AFTER ADVANCING 2 LINES.
1.2 输入与输出。

输出结果:
输入数据集:
1.3 结果分析
此程序的过程调用大致为:
写比较复杂的COBOL程序时,应当先设计好输入输出文件的对应关系,能够理清里面的数据,能够利用数值型来计算数据和能够利用编辑型数据用来输出;还有程序的核心过程部,最好先搞清楚程序的基本架构和其段与段之间的掉用关系,不会搞错逻辑关系。

2 步骤2 利用给出的数据和结构编辑报表
2.1 代码
2.1.1 标识部和环境部
ID DIVISION.
PROGRAM-ID. PRITABLE.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CUSTMAST ASSIGN CUSTMAST.
SELECT TABPRINT ASSIGN TABPRINT.
2.1.2 数据部
DATA DIVISION.
FILE SECTION.
FD CUSTMAST.
01 CUSTOMER-MASTER-RECORD.
05 CM-SPACE-1 PIC X.
05 CM-ACCOUNT-NUMBER PIC 9(5).
05 CM-SPACE-2 PIC X(3).
05 CM-SALES-AMOUNT PIC S9(5)V9(2).
05 CM-SPACE-3 PIC X(64).
FD TABPRINT.
01 TABLE-PRINT-RECORD PIC X(80).
WORKING-STORAGE SECTION.
01 SWITCHES.
05 CUSTMAST-EOF-SWITCH PIC X V ALUE "N".
01 CURRENT-DATE-AND-TIME.
05 CD-YEAR PIC 9999.
05 CD-MONTH PIC 99.
05 CD-DAY PIC 99.
05 CD-HOURS PIC 99.
05 CD-MINUTES PIC 99.
05 FILLER PIC X(9).
01 PRINT-FIELDS.
05 PAGE-COUNT PIC S9(3) VALUE ZERO.
05 LINES-ON-PAGE PIC S9(3) VALUE +17.
05 LINE-COUNT PIC S9(3) VALUE +99.
05 SPACE-CONTROL PIC S9.
01 TOTAL-FIELDS.
05 SALES-AMOUNT-TOTAL PIC S9(7)V99 VALUE ZERO.
05 DISCOUNT-AMOUNT-TOTAL PIC S9(5)V99 V ALUE ZERO.
05 NET-AMOUNT-TOTAL PIC S9(7)V99 V ALUE ZERO.
01 HEADING-LINE-1.
05 FILLER PIC X(32) V ALUE SPACE.
05 FILLER PIC X(15) V ALUE "EMPLOYEE REPORT".
05 FILLER PIC X(23) V ALUE SPACE.
05 FILLER PIC X(7) VALUE "PAGES: ".
05 HL1-PAGE-NUMBER PIC ZZ9.
01 HEADING-LINE-2.
05 FILLER PIC X(7) VALUE "DA TE: ".
05 HL2-YEAR PIC 9(4).
05 FILLER PIC X(1) VALUE "/".
05 HL2-MONTH PIC 9(2).
05 FILLER PIC X(1) VALUE "/".
05 HL2-DAY PIC 9(2).
05 FILLER PIC X(63) V ALUE SPACE.
01 HEADING-LINE-3.
05 FILLER PIC X(7) VALUE "TIME: ".
05 HL3-HOURS PIC 9(2).
05 FILLER PIC X(1) VALUE ":".
05 HL3-MINUTES PIC 9(2).
05 FILLER PIC X(53) V ALUE SPACE.
05 FILLER PIC X(10) V ALUE "PROGRAMER:".
05 FILLER PIC X(5) VALUE "EDWIN".
01 HEADING-LINE-4.
05 FILLER PIC X(80) V ALUE SPACE.
01 HEADING-LINE-5.
05 FILLER PIC X(7) VALUE "ACCOUNT".
05 FILLER PIC X(5) VALUE SPACE.
05 FILLER PIC X(11) VALUE "SALES ".
05 FILLER PIC X(5) VALUE SPACE.
05 FILLER PIC X(8) VALUE "DISCOUNT".
05 FILLER PIC X(5) VALUE SPACE.
05 FILLER PIC X(11) VALUE "NET ".
05 FILLER PIC X(28) VALUE SPACE.
01 HEADING-LINE-6.
05 FILLER PIC X(7) VALUE "NUMBER ".
05 FILLER PIC X(5) VALUE SPACE.
05 FILLER PIC X(11) VALUE "AMOUNT ".
05 FILLER PIC X(5) VALUE SPACE.
05 FILLER PIC X(8) VALUE "AMOUNT ".
05 FILLER PIC X(5) VALUE SPACE.
05 FILLER PIC X(11) VALUE "AMOUNT ".
05 FILLER PIC X(28) VALUE SPACE.
01 HEADING-LINE-7.
05 FILLER PIC X(30) V ALUE "******************************".
05 FILLER PIC X(30) V ALUE "******************************".
05 FILLER PIC X(20) V ALUE "********************".
01 ENDING-LINE-1.
05 FILLER PIC X(30) V ALUE "******************************".
05 FILLER PIC X(30) V ALUE "******************************".
05 FILLER PIC X(20) V ALUE "********************".
01 CUSTOMER-LINE.
05 CL-ACCOUNT-NUMBER PIC 9(5).
05 FILLER PIC X(7) VALUE SPACE.
05 CL-SALES-AMOUNT PIC \ZZ,ZZ9.99-.
05 FILLER PIC X(5) VALUE SPACE.
05 CL-DISCOUNT-AMOUNT PIC \ZZ9.99-.
05 FILLER PIC X(5) VALUE SPACE.
05 CL-NET-AMOUNT PIC \ZZ,ZZ9.99-.
05 FIFLER PIC X(30) VALUE SPACE.
01 TOTAL-LINE.
05 FILLER PIC X(12) VALUE SPACE.
05 TL-SALES-AMOUNT PIC \Z,ZZZ,ZZ9.99-.
05 FILLER PIC X(3) VALUE SPACE.
05 TL-DISCOUNT-AMOUNT PIC \ZZ,ZZ9.99-.
05 FILLER PIC X(3) VALUE SPACE.
05 TL-NET-AMOUNT PIC \Z,ZZZ,ZZ9.99-.
05 FIFLER PIC X(26) VALUE SPACE.
01 CALCULATED-FIFELDS.
05 DISCOUNT-AMOUNT PIC S9(5)V99.
05 NET-AMOUNT PIC S9(5)V99.
2.1.3 过程部
PROCEDURE DIVISION.
000-MAIN-FUNCTION-PRINT.
OPEN INPUT CUSTMAST OUTPUT TABPRINT.
PERFORM 100-FORMAT-DATE-AND-TIME.
PERFORM 200-PRINT-TABLE-LINES
UNTIL CUSTMAST-EOF-SWITCH = "Y".
PERFORM 300-PRINT-TOTAL.
CLOSE CUSTMAST, TABPRINT.
STOP RUN.
100-FORMA T-DA TE-AND-TIME.
MOVE FUNCTION CURRENT-DATE TO CURRENT-DATE-AND-TIME.
MOVE CD-YEAR TO HL2-YEAR.
MOVE CD-MONTH TO HL2-MONTH.
MOVE CD-DAY TO HL2-DAY.
MOVE CD-HOURS TO HL3-HOURS.
MOVE CD-MINUTES TO HL3-MINUTES.
200-PRINT-TABLE-LINES.
PERFORM 210-READ-INPUT-FILE.
IF CUSTMAST-EOF-SWITCH = "N"
PERFORM 220-PRINT-CONTROL.
210-READ-INPUT-FILE.
READ CUSTMAST
A T END
PERFORM 211-END-FILE.
211-END-FILE.
MOVE ENDING-LINE-1 TO TABLE-PRINT-RECORD.
WRITE TABLE-PRINT-RECORD.
MOVE "Y" TO CUSTMAST-EOF-SWITCH.
220-PRINT-CONTROL.
IF LINE-COUNT >= LINES-ON-PAGE
PERFORM 230-PRINT-HEADING-LINES.
MOVE CM-ACCOUNT-NUMBER TO CL-ACCOUNT-NUMBER.
DISPLAY CM-ACCOUNT-NUMBER.
DISPLAY CL-ACCOUNT-NUMBER.
MOVE CM-SALES-AMOUNT TO CL-SALES-AMOUNT.
DISPLAY CM-SALES-AMOUNT.
COMPUTE DISCOUNT-AMOUNT ROUNDED =
CM-SALES-AMOUNT * 0.02.
DISPLAY DISCOUNT-AMOUNT.
MOVE DISCOUNT-AMOUNT TO CL-DISCOUNT-AMOUNT.
DISPLAY CL-DISCOUNT-AMOUNT.
COMPUTE NET-AMOUNT ROUNDED =
CM-SALES-AMOUNT - DISCOUNT-AMOUNT.
MOVE NET-AMOUNT TO CL-NET-AMOUNT.
DISPLAY NET-AMOUNT.
DISPLAY SPACE-CONTROL.
DISPLAY LINE-COUNT.
DISPLAY CUSTOMER-LINE.
MOVE CUSTOMER-LINE TO TABLE-PRINT-RECORD.
WRITE TABLE-PRINT-RECORD AFTER ADV ANCING SPACE-CONTROL LINES.
ADD 1 TO LINE-COUNT.
ADD CM-SALES-AMOUNT TO SALES-AMOUNT-TOTAL.
ADD DISCOUNT-AMOUNT TO DISCOUNT-AMOUNT-TOTAL.
ADD NET-AMOUNT TO NET-AMOUNT-TOTAL.
MOVE 1 TO SPACE-CONTROL.
230-PRINT-HEADING-LINES.
ADD 1 TO PAGE-COUNT.
MOVE PAGE-COUNT TO HL1-PAGE-NUMBER.
MOVE HEADING-LINE-1 TO TABLE-PRINT-RECORD.
WRITE TABLE-PRINT-RECORD AFTER ADV ANCING PAGE.
MOVE HEADING-LINE-2 TO TABLE-PRINT-RECORD.
WRITE TABLE-PRINT-RECORD.
MOVE HEADING-LINE-3 TO TABLE-PRINT-RECORD.
WRITE TABLE-PRINT-RECORD.
MOVE HEADING-LINE-4 TO TABLE-PRINT-RECORD.
WRITE TABLE-PRINT-RECORD.
MOVE HEADING-LINE-5 TO TABLE-PRINT-RECORD.
WRITE TABLE-PRINT-RECORD.
MOVE HEADING-LINE-6 TO TABLE-PRINT-RECORD.
WRITE TABLE-PRINT-RECORD.
MOVE HEADING-LINE-7 TO TABLE-PRINT-RECORD.
WRITE TABLE-PRINT-RECORD.
MOVE ZERO TO LINE-COUNT.
MOVE 2 TO SPACE-CONTROL.
300-PRINT-TOTAL.
MOVE SALES-AMOUNT-TOTAL TO TL-SALES-AMOUNT.
MOVE DISCOUNT-AMOUNT-TOTAL TO TL-DISCOUNT-AMOUNT.
MOVE NET-AMOUNT-TOTAL TO TL-NET-AMOUNT.
MOVE TOTAL-LINE TO TABLE-PRINT-RECORD.
WRITE TABLE-PRINT-RECORD AFTER ADV ANCING 2 LINES.
2.2 输入与输出
输入数据集:
输出结果:
2.3 此题的结构和上面的结构差不多
五实验中遇到的错误与总结
错误:
1,拼写错误在写程序过程中,往往会犯拼写错误,在编译的时候发现一大堆,有的拼写错误编译的时候发现不了,比如说变量名字写成了另外一个变量,
在运行的时候才会提示s4038错误,这种错误很难找出来,写程序时应该尽量
避免拼写错误。

2,数据集格式错误,BLKSIZE要是记录长的倍数,输出数据集记录长要比义的时候+1,因为有一行是
打印控制字符。

否则报如下错误:
3,C07 错误提示:
数据集的打开关闭存在一些错误
4,$符号错误,要用美国037编码方式才有效,不能用中国编码方式。

5,COBOL程序前面行号(1-6)不能重复,否则会有COND CODE=4的结果。

相关文档
最新文档