I have a file as VB 300 with the following records:
EDIT R01029.COBOL.INPUT.VB Columns 00001 00072
Command ===> Scroll ===> CSR
****** ***************************** Top of Data ******************************
000001 10
000002 1020
000003 102030
000004 10203040
000005 1020304050
000006 10203040
000007 102030
000008 1020
000009 10
****** **************************** Bottom of Data ****************************
And I need the sum of all the fields for every row read.
This is how i managed to accomplish this
000100*READS VARIABLE SIZE DATA FROM A FILE AND CALCULATES SUM
000200 ID DIVISION.
000300 PROGRAM-ID.
000400 ADDFIELD.
000500 DATE-COMPILED.
000600 ENVIRONMENT DIVISION.
000700 INPUT-OUTPUT SECTION.
000800*I-O-CONTROL.
000900* RERUN ON RESCUE EVERY 100 RECORDS OF INPUT-FILE.
001000 FILE-CONTROL.
001100 SELECT INPUT-FILE ASSIGN TO READER
001200 ORGANIZATION IS SEQUENTIAL
001300 ACCESS MODE IS SEQUENTIAL
001400 FILE STATUS IS FILE-STATUS.
001500 DATA DIVISION.
001600 FILE SECTION.
001700 FD INPUT-FILE
001800 BLOCK CONTAINS 27703 TO 27998 CHARACTERS
001900 RECORD IS VARYING IN SIZE FROM 2 TO 296 CHARACTERS
002000 DEPENDING ON SIZE-VAR
002100 LABEL RECORDS ARE STANDARD
002200 DATA RECORD IS INPUT-REC
002300 RECORDING MODE IS V.
002400 01 INPUT-REC.
002500 88 END-OF-FILE VALUE HIGH-VALUES.
002600 05 STRING-IN OCCURS 1 TO 148 TIMES DEPENDING ON DSIZE-VAR.
002700 10 NUM-IN PIC 9(2).
002800 WORKING-STORAGE SECTION.
002900 01 FILE-STATUS PIC X(2).
003000 01 SIZE-VAR PIC 9(3).
003100 01 DSIZE-VAR PIC 9(3).
003200 01 COUNTER PIC 9(3).
003300 01 OUTPUT-SUM PIC 9(3).
003400 01 OUTPUT-SUM-MOD PIC Z(3).
003500 PROCEDURE DIVISION.
003600 DECLARATIVES.
003700 USE-PROCEDURE SECTION.
003800 USE AFTER EXCEPTION PROCEDURE ON INPUT-FILE.
003900 COPY-PROCEDURE.
004000 COPY FILESTAT.
004100 END DECLARATIVES.
004200 MAINLINE SECTION.
004300 100-MAIN-PARA.
004400 INITIALIZE SIZE-VAR
004500 OPEN INPUT INPUT-FILE
004600 PERFORM UNTIL END-OF-FILE
004700 READ INPUT-FILE
004800 AT END
004900 SET END-OF-FILE TO TRUE
005000 NOT AT END
005100 PERFORM 200-DISPLAY-PARA
005200 END-READ
005300 END-PERFORM
005400 CLOSE INPUT-FILE
005500 STOP RUN.
005600 200-DISPLAY-PARA.
005700 DISPLAY ' '
005800 DISPLAY 'DATA SIZE: ' SIZE-VAR
005900 DISPLAY 'DATA TEXT: ' INPUT-REC(1:SIZE-VAR)
006000 INITIALIZE OUTPUT-SUM
006100 DIVIDE 2 INTO SIZE-VAR GIVING DSIZE-VAR
006200 PERFORM VARYING COUNTER FROM 1 BY 1 UNTIL COUNTER > DSIZE-VAR
006300 ADD NUM-IN(COUNTER) TO OUTPUT-SUM
006400 END-PERFORM
006500 MOVE OUTPUT-SUM TO OUTPUT-SUM-MOD
006600 DISPLAY 'OUTPUT: ' OUTPUT-SUM-MOD
006700 DISPLAY ' '.
My FILESTAT member that I use for the DECLARATIVES section in all my FILE handling programs is as below:
DISPLAY 'FILE-STATUS: ' FILE-STATUS
EVALUATE FILE-STATUS
WHEN '02' DISPLAY 'DUPLICATE KEY DETECTED'
WHEN '04' DISPLAY 'READ, WRONG LENGTH RECORD'
WHEN '05' DISPLAY 'OPEN, OPTIONAL FILE NOT PRESENT'
WHEN '07' DISPLAY 'CLOSE INCOMPATIBLE TAPE FILE'
WHEN '10' DISPLAY 'END OF FILE DETECTED'
WHEN '14' DISPLAY 'RRN > RELATIVE KEY DATA'
WHEN '20' DISPLAY 'INVALID KEY VSAM KSDS OR RRDS'
WHEN '21' DISPLAY 'RECORD OUT OF SEQUENCE'
WHEN '22' DISPLAY 'DUPLICATE KEY'
WHEN '23' DISPLAY 'RECORD OR FILE NOT FOUND'
WHEN '24' DISPLAY 'FILE BOUNDARY VIOLATION.'
DISPLAY 'COBOL 370: REL: REC# TOO BIG'
DISPLAY 'OUT OF SPACE ON KSDS/RRDS FILE'
WHEN '30' DISPLAY 'PERMANENT DATA ERROR'
DISPLAY 'DATA CHECK, PARITY CHK'
WHEN '34' DISPLAY 'BOUNDARY VIOLATION'
DISPLAY 'WRITE PAST END OF ESDS RECORD'
DISPLAY 'OR NO SPACE TO ADD KSDS/RRDS RECORD'
DISPLAY 'OUT OF SPACE ON SEQUENTIAL FILE'
WHEN '35' DISPLAY 'OPEN, FILE NOT PRESENT'
WHEN '37' DISPLAY 'OPEN MODE INCOMPAT WITH DEVICE'
WHEN '38' DISPLAY 'OPENING FILE CLOSED WITH LOCK'
WHEN '39' DISPLAY 'OPEN, FILE ATTRIB CONFLICTING'
WHEN '41' DISPLAY 'OPEN, FILE IS OPEN'
WHEN '42' DISPLAY 'CLOSE, FILE IS CLOSED'
WHEN '43' DISPLAY 'DELETE OR REWRITE & NO GOOD READ FIRST'
WHEN '44' DISPLAY 'BOUNDARY VIOLATION/REWRITE REC TOO BIG'
WHEN '46' DISPLAY 'SEQUENTIAL READ WITHOUT POSITIONING'
WHEN '47' DISPLAY 'READING FILE NOT OPEN AS INPUT/IO/EXTEND'
WHEN '48' DISPLAY 'WRITE WITHOUT OPEN IO'
WHEN '49' DISPLAY 'DELETE OR REWRITE WITHOUT OPEN IO'
WHEN '90' DISPLAY 'UNKNOWN'
WHEN '91' DISPLAY 'VSAM - PASSWORD FAILURE'
WHEN '92' DISPLAY 'LOGIC ERROR/WRONG MODE OPERATION'
WHEN '93' DISPLAY 'VSAM - RESOURCE NOT AVAILABLE'
WHEN '94' DISPLAY 'VSAM - SEQUENTIAL READ AFTER END OF FILE'
DISPLAY 'OR NO CURRENT REC POINTER FOR SEQ'
WHEN '95' DISPLAY 'VSAM - INVALID FILE INFORMATION'
WHEN '96' DISPLAY 'VSAM - MISSING DD STATEMENT IN JCL'
WHEN '97' DISPLAY 'VSAM - OPEN OK, FILE INTEGRITY VERIFIED'
WHEN OTHER DISPLAY 'UNKNOWN REASON:' FILE-STATUS
END-EVALUATE
MOVE 12 TO RETURN-CODE
STOP RUN.
(Adapted from ibmmainframes.com)
JCL:
//COBOLCOM JOB (0000),'COMPILE COBOL PGM',
// CLASS=A,MSGCLASS=0,MSGLEVEL=(1,1),NOTIFY=R01029
//PROCLIB JCLLIB ORDER='SYS1.ADMIN.PROCLIB'
//COB##COM EXEC IGYWCL,MEMBER=ADDFIELD,
// SRCELIB=R01029.COBOL.PGM,
// LOADLIB=R01029.COBOL.LOADLIB,
// PARM.COBOL='LIB,CODEPAGE(37),LIST',
// COPYLIB1=R01029.COBOL.DCLGEN
//RUN##PGM EXEC PGM=ADDFIELD,COND=(4,LE)
//READER DD DSN=R01029.COBOL.INPUT.VB,DISP=SHR
//STEPLIB DD DSN=R01029.COBOL.LOADLIB,DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//PRINT EXEC PGM=IDCAMS,COND=(4,LE)
//SYSPRINT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//INDD DD DSN=R01029.COBOL.INPUT.VB,
// DISP=SHR,DCB=RECFM=U
//SYSIN DD *
PRINT -
INFILE(INDD) -
DUMP
I use the PRINT step to verify the RDW(whether the file data is indeed VB or not)
EDIT R01029.COBOL.INPUT.VB Columns 00001 00072
Command ===> Scroll ===> CSR
****** ***************************** Top of Data ******************************
000001 10
000002 1020
000003 102030
000004 10203040
000005 1020304050
000006 10203040
000007 102030
000008 1020
000009 10
****** **************************** Bottom of Data ****************************
And I need the sum of all the fields for every row read.
This is how i managed to accomplish this
000100*READS VARIABLE SIZE DATA FROM A FILE AND CALCULATES SUM
000200 ID DIVISION.
000300 PROGRAM-ID.
000400 ADDFIELD.
000500 DATE-COMPILED.
000600 ENVIRONMENT DIVISION.
000700 INPUT-OUTPUT SECTION.
000800*I-O-CONTROL.
000900* RERUN ON RESCUE EVERY 100 RECORDS OF INPUT-FILE.
001000 FILE-CONTROL.
001100 SELECT INPUT-FILE ASSIGN TO READER
001200 ORGANIZATION IS SEQUENTIAL
001300 ACCESS MODE IS SEQUENTIAL
001400 FILE STATUS IS FILE-STATUS.
001500 DATA DIVISION.
001600 FILE SECTION.
001700 FD INPUT-FILE
001800 BLOCK CONTAINS 27703 TO 27998 CHARACTERS
001900 RECORD IS VARYING IN SIZE FROM 2 TO 296 CHARACTERS
002000 DEPENDING ON SIZE-VAR
002100 LABEL RECORDS ARE STANDARD
002200 DATA RECORD IS INPUT-REC
002300 RECORDING MODE IS V.
002400 01 INPUT-REC.
002500 88 END-OF-FILE VALUE HIGH-VALUES.
002600 05 STRING-IN OCCURS 1 TO 148 TIMES DEPENDING ON DSIZE-VAR.
002700 10 NUM-IN PIC 9(2).
002800 WORKING-STORAGE SECTION.
002900 01 FILE-STATUS PIC X(2).
003000 01 SIZE-VAR PIC 9(3).
003100 01 DSIZE-VAR PIC 9(3).
003200 01 COUNTER PIC 9(3).
003300 01 OUTPUT-SUM PIC 9(3).
003400 01 OUTPUT-SUM-MOD PIC Z(3).
003500 PROCEDURE DIVISION.
003600 DECLARATIVES.
003700 USE-PROCEDURE SECTION.
003800 USE AFTER EXCEPTION PROCEDURE ON INPUT-FILE.
003900 COPY-PROCEDURE.
004000 COPY FILESTAT.
004100 END DECLARATIVES.
004200 MAINLINE SECTION.
004300 100-MAIN-PARA.
004400 INITIALIZE SIZE-VAR
004500 OPEN INPUT INPUT-FILE
004600 PERFORM UNTIL END-OF-FILE
004700 READ INPUT-FILE
004800 AT END
004900 SET END-OF-FILE TO TRUE
005000 NOT AT END
005100 PERFORM 200-DISPLAY-PARA
005200 END-READ
005300 END-PERFORM
005400 CLOSE INPUT-FILE
005500 STOP RUN.
005600 200-DISPLAY-PARA.
005700 DISPLAY ' '
005800 DISPLAY 'DATA SIZE: ' SIZE-VAR
005900 DISPLAY 'DATA TEXT: ' INPUT-REC(1:SIZE-VAR)
006000 INITIALIZE OUTPUT-SUM
006100 DIVIDE 2 INTO SIZE-VAR GIVING DSIZE-VAR
006200 PERFORM VARYING COUNTER FROM 1 BY 1 UNTIL COUNTER > DSIZE-VAR
006300 ADD NUM-IN(COUNTER) TO OUTPUT-SUM
006400 END-PERFORM
006500 MOVE OUTPUT-SUM TO OUTPUT-SUM-MOD
006600 DISPLAY 'OUTPUT: ' OUTPUT-SUM-MOD
006700 DISPLAY ' '.
My FILESTAT member that I use for the DECLARATIVES section in all my FILE handling programs is as below:
DISPLAY 'FILE-STATUS: ' FILE-STATUS
EVALUATE FILE-STATUS
WHEN '02' DISPLAY 'DUPLICATE KEY DETECTED'
WHEN '04' DISPLAY 'READ, WRONG LENGTH RECORD'
WHEN '05' DISPLAY 'OPEN, OPTIONAL FILE NOT PRESENT'
WHEN '07' DISPLAY 'CLOSE INCOMPATIBLE TAPE FILE'
WHEN '10' DISPLAY 'END OF FILE DETECTED'
WHEN '14' DISPLAY 'RRN > RELATIVE KEY DATA'
WHEN '20' DISPLAY 'INVALID KEY VSAM KSDS OR RRDS'
WHEN '21' DISPLAY 'RECORD OUT OF SEQUENCE'
WHEN '22' DISPLAY 'DUPLICATE KEY'
WHEN '23' DISPLAY 'RECORD OR FILE NOT FOUND'
WHEN '24' DISPLAY 'FILE BOUNDARY VIOLATION.'
DISPLAY 'COBOL 370: REL: REC# TOO BIG'
DISPLAY 'OUT OF SPACE ON KSDS/RRDS FILE'
WHEN '30' DISPLAY 'PERMANENT DATA ERROR'
DISPLAY 'DATA CHECK, PARITY CHK'
WHEN '34' DISPLAY 'BOUNDARY VIOLATION'
DISPLAY 'WRITE PAST END OF ESDS RECORD'
DISPLAY 'OR NO SPACE TO ADD KSDS/RRDS RECORD'
DISPLAY 'OUT OF SPACE ON SEQUENTIAL FILE'
WHEN '35' DISPLAY 'OPEN, FILE NOT PRESENT'
WHEN '37' DISPLAY 'OPEN MODE INCOMPAT WITH DEVICE'
WHEN '38' DISPLAY 'OPENING FILE CLOSED WITH LOCK'
WHEN '39' DISPLAY 'OPEN, FILE ATTRIB CONFLICTING'
WHEN '41' DISPLAY 'OPEN, FILE IS OPEN'
WHEN '42' DISPLAY 'CLOSE, FILE IS CLOSED'
WHEN '43' DISPLAY 'DELETE OR REWRITE & NO GOOD READ FIRST'
WHEN '44' DISPLAY 'BOUNDARY VIOLATION/REWRITE REC TOO BIG'
WHEN '46' DISPLAY 'SEQUENTIAL READ WITHOUT POSITIONING'
WHEN '47' DISPLAY 'READING FILE NOT OPEN AS INPUT/IO/EXTEND'
WHEN '48' DISPLAY 'WRITE WITHOUT OPEN IO'
WHEN '49' DISPLAY 'DELETE OR REWRITE WITHOUT OPEN IO'
WHEN '90' DISPLAY 'UNKNOWN'
WHEN '91' DISPLAY 'VSAM - PASSWORD FAILURE'
WHEN '92' DISPLAY 'LOGIC ERROR/WRONG MODE OPERATION'
WHEN '93' DISPLAY 'VSAM - RESOURCE NOT AVAILABLE'
WHEN '94' DISPLAY 'VSAM - SEQUENTIAL READ AFTER END OF FILE'
DISPLAY 'OR NO CURRENT REC POINTER FOR SEQ'
WHEN '95' DISPLAY 'VSAM - INVALID FILE INFORMATION'
WHEN '96' DISPLAY 'VSAM - MISSING DD STATEMENT IN JCL'
WHEN '97' DISPLAY 'VSAM - OPEN OK, FILE INTEGRITY VERIFIED'
WHEN OTHER DISPLAY 'UNKNOWN REASON:' FILE-STATUS
END-EVALUATE
MOVE 12 TO RETURN-CODE
STOP RUN.
(Adapted from ibmmainframes.com)
JCL:
//COBOLCOM JOB (0000),'COMPILE COBOL PGM',
// CLASS=A,MSGCLASS=0,MSGLEVEL=(1,1),NOTIFY=R01029
//PROCLIB JCLLIB ORDER='SYS1.ADMIN.PROCLIB'
//COB##COM EXEC IGYWCL,MEMBER=ADDFIELD,
// SRCELIB=R01029.COBOL.PGM,
// LOADLIB=R01029.COBOL.LOADLIB,
// PARM.COBOL='LIB,CODEPAGE(37),LIST',
// COPYLIB1=R01029.COBOL.DCLGEN
//RUN##PGM EXEC PGM=ADDFIELD,COND=(4,LE)
//READER DD DSN=R01029.COBOL.INPUT.VB,DISP=SHR
//STEPLIB DD DSN=R01029.COBOL.LOADLIB,DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//PRINT EXEC PGM=IDCAMS,COND=(4,LE)
//SYSPRINT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//INDD DD DSN=R01029.COBOL.INPUT.VB,
// DISP=SHR,DCB=RECFM=U
//SYSIN DD *
PRINT -
INFILE(INDD) -
DUMP
I use the PRINT step to verify the RDW(whether the file data is indeed VB or not)
No comments:
Post a Comment