Search code examples
cobolmainframezos

COBOL program won't output the detail lines in my report


EDIT: Figured it out. I needed to call the read again at the end of A420-COUNT-MARKS

Edit: Working on a z/OS mainframe that I'm accessing via Vista TN3270. The program is submitted using JCL which was provided by the teacher.

I'm in school for programming and I have a COBOL assignment where my program reads a file full of subject names and codes and a file full of student marks and an associated subject code. It must use this info to create a report that lists all the subjects and count the number of students that received grades of A , B, C, D or F for each subject. It then totals up the amount of each grade at the bottom.

Report example:

01         ABC COLLEGE TESTING CENTER
02         TEST RESULTS SUMMARY           DATE: yyyy/mm/dd
03
04 SUBJECT NAME                  A           B            C           D        F
05
06 xxxxxxxxxxxxxxxxxxxx        9,999       9,999        9,999       9,999    9,999
07 xxxxxxxxx                   9,999       9,999        9,999       9,999    9,999
19
20 TOTAL                      99,999      99,999       99,999      99,999   99,999

The problem is that my program is only outputting the header rows, but won't output the detail rows or the grand total row. I've written functions to perform these things but they're not getting any errors so I have no idea what's going wrong.

Here's my file control and file section:

FILE-CONTROL.                               
    SELECT F01-SUBJ-FILE ASSIGN TO F01SUBJ. 
    SELECT F02-MARK-FILE ASSIGN TO F02MARK. 
    SELECT F03-REPT-FILE ASSIGN TO F03REPT. 

FILE SECTION.                      
FD  F01-SUBJ-FILE                  
    RECORDING MODE IS F            
    RECORD CONTAINS 80 CHARACTERS  
    DATA RECORD IS F01-SUBJ-RECORD.
01  F01-SUBJ-RECORD.               
    05  F01-SUBJ-CODE  PIC X(6).   
    05  F01-SUBJ-NAME  PIC X(20).  
    05                 PIC X(54).  

FD  F02-MARK-FILE                 
    RECORDING MODE IS F           
    RECORD CONTAINS 80 CHARACTERS 
    DATA RECORD IS F02-MARK-RECORD
01  F02-MARK-RECORD.              
    05  F02-STUD-NAME  PIC  X(20).
    05  F02-SUBJ-CODE  PIC  X(6). 
    05                 PIC  X.    
    05  F02-DATE-TEST  PIC  X(8). 
    05  F02-STUD-MARK  PIC  9(3). 
    05                 PIC  X(42).

FD  F03-REPT-FILE                  
    RECORDING MODE IS F            
    RECORD CONTAINS 120 CHARACTERS 
    DATA RECORD IS F03-REPT-RECORD.
01  F03-REPT-RECORD.               
    05                 PIC X(120). 

Here's working storage:

WORKING-STORAGE SECTION.                   
01  W01-EOF-SWITCH.                        
    05  W01-MARK-EOF       PIC X VALUE 'N'.
    05  W01-SUBJ-EOF       PIC X VALUE 'N'.

01  W02-TEST-TABLE.                               
    05  W02-SUBJ-COUNT     PIC 99 VALUE 0.        
    05  W02-SUBJ-MAX       PIC 99 VALUE 50.       
    05  W02-TEST-ROW OCCURS 1 TO 50               
        DEPENDING ON W02-SUBJ-COUNT               
        ASCENDING KEY IS W02-SUBJ-CODE            
        INDEXED BY W02-IDX.                       
        10  W02-SUBJ-CODE  PIC X(6)  VALUE SPACES.
        10  W02-SUBJ-NAME  PIC X(20) VALUE SPACES.
        10  W02-A-CTR      PIC 9999  VALUE 0.     
        10  W02-B-CTR      PIC 9999  VALUE 0.     
        10  W02-C-CTR      PIC 9999  VALUE 0.     
        10  W02-D-CTR      PIC 9999  VALUE 0.     
        10  W02-F-CTR      PIC 9999  VALUE 0.     

01  W03-REPT.                                        
    05  W03-HEADER-ROW1.                             
        10                 PIC X(9)  VALUE SPACES.   
        10                 PIC X(3)  VALUE 'ABC'.    
        10                 PIC X     VALUE SPACES.   
        10                 PIC X(7)  VALUE 'COLLEGE'.
        10                 PIC X     VALUE SPACES.   
        10                 PIC X(7)  VALUE 'TESTING'.
        10                 PIC X     VALUE SPACES.   
        10                 PIC X(6)  VALUE 'CENTER'. 
        10                 PIC X(85) VALUE SPACES.   
    05  W03-HEADER-ROW2.                             
        10                 PIC X(9)  VALUE SPACES.   
        10                 PIC X(4)  VALUE 'TEST'.   
        10                 PIC X     VALUE SPACES.   
        10                 PIC X(7)  VALUE 'RESULTS'.
        10                 PIC X     VALUE SPACES.   
        10                 PIC X(7)  VALUE 'SUMMARY'.
        10                 PIC X(11) VALUE SPACES.   
        10                 PIC X(5)  VALUE 'DATE:'.  
        10                 PIC X     VALUE SPACES.   
        10  W03-YEAR       PIC 9999.                 
        10                 PIC X     VALUE '/'.      
        10  W03-MONTH      PIC 99.                   
        10                 PIC X     VALUE '/'.      
        10  W03-DAY        PIC 99.                   
        10                 PIC X(64) VALUE SPACES. 
    05  W03-HEADER-ROW3.                              
        10                 PIC X     VALUE SPACES.    
        10                 PIC X(7)  VALUE 'SUBJECT'. 
        10                 PIC X     VALUE SPACES.    
        10                 PIC X(4)  VALUE 'NAME'.    
        10                 PIC X(15) VALUE SPACES.    
        10                 PIC X     VALUE 'A'.       
        10                 PIC X(7)  VALUE SPACES.    
        10                 PIC X     VALUE 'B'.       
        10                 PIC X(7)  VALUE SPACES.    
        10                 PIC X     VALUE 'C'.       
        10                 PIC X(7)  VALUE SPACES.    
        10                 PIC X     VALUE 'D'.       
        10                 PIC X(7)  VALUE SPACES.    
        10                 PIC X     VALUE 'F'.         
        10                 PIC X(59) VALUE SPACES.
    05  W03-DETAIL-ROW.                            
        10                 PIC X     VALUE SPACES. 
        10  W03-SUBJ-NAME  PIC X(20).              
        10                 PIC XXX   VALUE SPACES. 
        10  W03-A-CTR      PIC Z,ZZ9.              
        10                 PIC XXX   VALUE SPACES. 
        10  W03-B-CTR      PIC Z,ZZ9.              
        10                 PIC XXX   VALUE SPACES. 
        10  W03-C-CTR      PIC Z,ZZ9.              
        10                 PIC XXX   VALUE SPACES. 
        10  W03-D-CTR      PIC Z,ZZ9.              
        10                 PIC XXX   VALUE SPACES. 
        10  W03-F-CTR      PIC Z,ZZ9.              
        10                 PIC X(59) VALUE SPACES. 

01  W04-SYS-DATE.                       
    05  W04-YEAR           PIC 9999.    
    05  W04-MONTH          PIC 99.      
    05  W04-DAY            PIC 99.      

01  W05-TOTALS.                               
    05  W05-TOTAL-A        PIC 99999 VALUE 0. 
    05  W05-TOTAL-B        PIC 99999 VALUE 0. 
    05  W05-TOTAL-C        PIC 99999 VALUE 0. 
    05  W05-TOTAL-D        PIC 99999 VALUE 0. 
    05  W05-TOTAL-F        PIC 99999 VALUE 0. 

Here's procedure division

PROCEDURE DIVISION.              
    PERFORM A100-OPEN-FILES      
    PERFORM A200-WRITE-HEADINGS  
    PERFORM A300-PROCESS-SUBJECTS
    PERFORM A400-PROCESS-MARKS   
    PERFORM A500-WRITE-TOTALS    
    PERFORM A600-CLOSE-FILES     
    STOP RUN                     
    .                           

 A100-OPEN-FILES.              
*    OPENS FILES               
     OPEN INPUT  F01-SUBJ-FILE 
                 F02-MARK-FILE 
     OPEN OUTPUT F03-REPT-FILE 
     .                         

 A200-WRITE-HEADINGS.                                 
*    WRITES HEADERS TO THE REPORT FILE                
     MOVE W03-HEADER-ROW1 TO F03-REPT-RECORD          
     WRITE F03-REPT-RECORD                            

     MOVE FUNCTION CURRENT-DATE (1:8) TO W04-SYS-DATE 
     MOVE W04-YEAR  TO W03-YEAR                       
     MOVE W04-MONTH TO W03-MONTH                      
     MOVE W04-DAY   TO W03-DAY                        

     MOVE W03-HEADER-ROW2 TO F03-REPT-RECORD          
     WRITE F03-REPT-RECORD                            

     MOVE W03-HEADER-ROW3 TO F03-REPT-RECORD          
     WRITE F03-REPT-RECORD                            
     .

 A300-PROCESS-SUBJECTS.                                     
*    MOVES SUBJECT NAMES AND CODES INTO W02-TEST-TABLE      
     PERFORM A310-READ-RECORD                               
     PERFORM UNTIL W01-SUBJ-EOF = 'Y'                       
         IF W02-SUBJ-COUNT < W02-SUBJ-MAX                   
             ADD 1 TO W02-SUBJ-COUNT                        
             SET W02-IDX TO W02-SUBJ-COUNT                  
             MOVE F01-SUBJ-CODE TO W02-SUBJ-CODE(W02-IDX)   
             MOVE F01-SUBJ-NAME TO W02-SUBJ-NAME(W02-IDX)   
         ELSE                                               
             DISPLAY "ERROR - SUBJECT FILE EXCEEDS MAX OF " 
                 W02-SUBJ-MAX " RECORDS, RECORD IGNORED"                       
         END-IF                                             
         PERFORM  A310-READ-RECORD                          
     END-PERFORM
     .          

 A310-READ-RECORD.                                      
*    READS FROM THE SUBJECT FILE INTO THE SUBJECT RECORD
     READ F01-SUBJ-FILE                                 
         AT END MOVE 'Y' TO W01-SUBJ-EOF                
     END-READ                                           
     .                                                  

 A400-PROCESS-MARKS.             
     PERFORM A410-READ-RECORD    
     PERFORM A420-COUNT-MARKS    
         UNTIL W01-MARK-EOF = 'Y'
     .                           

 A410-READ-RECORD.                                  
*    READS FROM THE MARK FILE INTO THE MARK RECORD  
     READ F02-MARK-FILE                             
         AT END MOVE 'Y' TO W01-MARK-EOF            
     END-READ                                       
     .                                              

 A420-COUNT-MARKS.                                               
*    COUNTS GRADE TOTALS                                         
     SET W02-IDX TO 1                                            
     SEARCH ALL W02-TEST-ROW                                     
         AT END DISPLAY 'INVALID INPUT RECORD: ' F02-MARK-RECORD 
         WHEN W02-SUBJ-CODE(W02-IDX) = F02-SUBJ-CODE             
             EVALUATE F02-STUD-MARK                              
                 WHEN "80" THRU "100"                            
                    ADD 1 TO W05-TOTAL-A                         
                    ADD 1 TO W02-A-CTR(W02-IDX)                  
                 WHEN "70" THRU "79"                             
                    ADD 1 TO W05-TOTAL-B                         
                    ADD 1 TO W02-B-CTR(W02-IDX)                  
                 WHEN "60" THRU "69"               
                    ADD 1 TO W05-TOTAL-C           
                    ADD 1 TO W02-C-CTR(W02-IDX)    
                 WHEN "50" THRU "59"               
                    ADD 1 TO W05-TOTAL-D           
                    ADD 1 TO W02-D-CTR(W02-IDX)    
                 WHEN OTHER                        
                    ADD 1 TO W05-TOTAL-F           
                    ADD 1 TO W02-F-CTR(W02-IDX)    
             END-EVALUATE                          
     END-SEARCH                                    
     .                                             

 A500-WRITE-TOTALS.                         
     PERFORM A510-WRITE-SUBJ-GRADE-TOTALS   
     PERFORM A520-WRITE-GRADE-GRAND-TOTALS  
     .                                      

 A510-WRITE-SUBJ-GRADE-TOTALS.              
     PERFORM VARYING W02-IDX FROM 1 BY 1  
     UNTIL W02-IDX > W02-SUBJ-COUNT       
          MOVE W02-SUBJ-NAME(W02-IDX) TO W03-SUBJ-NAME  
          MOVE W02-A-CTR(W02-IDX) TO W03-A-CTR          
          MOVE W02-B-CTR(W02-IDX) TO W03-B-CTR          
          MOVE W02-C-CTR(W02-IDX) TO W03-C-CTR          
          MOVE W02-D-CTR(W02-IDX) TO W03-D-CTR          
          MOVE W02-F-CTR(W02-IDX) TO W03-F-CTR          
          MOVE W03-DETAIL-ROW TO F03-REPT-RECORD        
          WRITE F03-REPT-RECORD                            
     END-PERFORM   
     .               

 A520-WRITE-GRADE-GRAND-TOTALS.                       
*    WRITES THE GRADE GRAND TOTALS TO THE REPORT FILE 
*    AFTER INSERTING A BLANK ROW                      
     MOVE SPACES TO F03-REPT-RECORD                   
     WRITE F03-REPT-RECORD                            

     MOVE W05-TOTAL-A TO W03-TOTAL-A                  
     MOVE W05-TOTAL-B TO W03-TOTAL-B                  
     MOVE W05-TOTAL-C TO W03-TOTAL-C                  
     MOVE W05-TOTAL-D TO W03-TOTAL-D                  
     MOVE W05-TOTAL-F TO W03-TOTAL-F                  

     MOVE W03-TOTAL-ROW TO F03-REPT-RECORD            
     WRITE F03-REPT-RECORD                            
     .                                                

 A600-CLOSE-FILES.        
*    CLOSES THE FILES     
     CLOSE F01-SUBJ-FILE  
           F02-MARK-FILE  
           F03-REPT-FILE  
     .                    

Solution

  • I figured out what was wrong with my program by placing a DISPLAY at the start of each function which output what function was running. I saw that it was in an infinite loop in A420-COUNT-MARKS and that I forgot to add a PERFORM A410-READ-RECORD at the end of it.