Powered By Blogger

Sunday, March 27, 2011

COBOL: Read Variable Block data from a file and sum them.

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)


No comments:

Post a Comment