COBOL read/store in table

cobol

The goal of this exercise is to read and store an input file into a table then validate certain fields within the input and output any error records. I need to read and store each policy group so that there are just 5 records stored in the table at a time instead of the entire file.

So I need to read in a policy group which is 5 records, do the processing, then read the next 5 records, etc until the end of the file..

This is the input file.
10A 011111          2005062520060625                                    
20A 011111000861038                                                     
32A 011111                            79372                             
60A 0111112020                                             6          4 
94A 011111     080 1                                                    
10A 02222          2005082520060825                                    
20A 022221000187062                                                     
32A 022221                            05038                             
60A 0222212003                                             6          4 
94A 022221     090 1                                                    
....

I was able to load the first 5 records into a table by having my table OCCUR 5 TIMES but I don't know how I would continue that. My code is below. (I wrote it just to see if it was working correctly, but it prints the header line with the first 4 records, instead of just the first 5)
01 TABLES.

05  T1-RECORD-TABLE.                                
    10  T1-ENTRY                OCCURS 5 TIMES      
                                INDEXED BY T1-INDEX.

        15  RECORD-TYPE-10      PIC X(80).          
        15  RECORD-TYPE-20      PIC X(80).          
        15  RECORD-TYPE-32      PIC X(80).          
        15  RECORD-TYPE-60      PIC X(80).          
        15  RECORD-TYPE-94      PIC X(80).          

 copy trnrec10.
 COPY TRNREC20.
 COPY TRNREC32.
 COPY TRNREC60.
 COPY TRNREC94.
.....

Z200-READ-FILES.                               
    READ DISK-IN INTO T1-ENTRY(T1-INDEX)       
        AT END MOVE 'YES' TO END-OF-FILE-SW.   

    WRITE PRINT-RECORD FROM T1-ENTRY(T1-INDEX).

I don't want a step by step for this (though that'd be nice :P) bc I know WHAT I need to do I just don't know HOW to do it bc my textbook and course note are useless to me. I've been stuck on this for a while and nothing I try works.

Best Solution

I'm assuming that every policy group has exactly 5 records with the 5 record types.

You can set up your working storage like this.

05  T1-RECORD.
    10  T1-RECORD-TYPE               PIC XX.
    10  FILLER                       PIC X(78).      

 COPY TRNREC10.
 COPY TRNREC20.
 COPY TRNREC32.
 COPY TRNREC60.
 COPY TRNREC94.

Then your read paragraph would look like this. I assumed that TRNREC10-RECORD was the 01 level of the TRNREC10 copybook. if not, substitute the actual 01 levels in the following code.

2200-READ-FILE.                               
    READ DISK-IN INTO T1-RECORD      
        AT END MOVE 'YES' TO END-OF-FILE-SW.  

    IF END-OF-FILE-SW = 'NO'
        IF T1-RECORD-TYPE = '10'
            MOVE T1-RECORD TO TRNREC10-RECORD
        END-IF
        IF T1-RECORD-TYPE = '20'
            MOVE T1-RECORD TO TRNREC20-RECORD
        END-IF
        ...
    END-IF.

Your write paragraph would look like this

2400-WRITE-FILE.
    WRITE PRINT-RECORD FROM TRNREC10-RECORD
    WRITE PRINT-RECORD FROM TRNREC20-RECORD
    ...

Your processing paragraphs would access the data in the copybook records.

Related Question