Программа COBOL не выводит подробные строки в моем отчете - PullRequest
1 голос
/ 13 октября 2019

РЕДАКТИРОВАТЬ: Разобрался. Мне нужно было снова вызвать чтение в конце A420-COUNT-MARKS

Редактировать: Работа на мэйнфрейме az / OS, к которому я обращаюсь через Vista TN3270. Программа представлена ​​с использованием JCL, предоставленного преподавателем.

Я учусь в школе по программированию, и у меня есть задание на COBOL, где моя программа читает файл, полный названий предметов и кодов, а также файл, содержащий оценки учащихся и соответствующий код предмета. Он должен использовать эту информацию для создания отчета, в котором перечислены все предметы и подсчитано количество студентов, получивших оценки A, B, C, D или F по каждому предмету. Затем он суммирует количество каждой оценки в нижней части.

Пример отчета:

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

Проблема заключается в том, что моя программа выводит только строки заголовка, но не выводит строки сведений или строку общего итога. Я написал функции для выполнения этих задач, но они не получают никаких ошибок, поэтому я понятия не имею, что происходит не так.

Вот мой раздел управления файлами и файлов:

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). 

Вот рабочее хранилище:

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. 

Вот разделение процедур

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  
     .                    

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Я выяснил, что не так с моей программой, поместив DISPLAY в начало каждой функции, которая выводит, какая функция выполнялась. Я увидел, что в A420-COUNT-MARKS это было в бесконечном цикле, и что я забыл добавить PERFORM A410-READ-RECORD в конце.

0 голосов
/ 15 октября 2019

Я рад, что ты понял это, Том.

Надеюсь, ты не выключен и будешь исследовать дальше. К вашему сведению, в то время как ISPF, TSO / E и другие классические пользовательские интерфейсы все еще работают (и некоторые люди все еще любят их, и они будут продолжать работать «вечно»), в настоящее время разработчики часто используют и предпочитают графические пользовательские интерфейсы. Есть несколько бесплатных, например, IBM Explorer для z / OS и его Remote System Explorer (RSE):

https://developer.ibm.com/mainframe/products/zosexplorer/

, который прекрасно работает сам по себе на Mac или ПК(Linux или Windows), как вы предпочитаете (с частью RSE в z / OS). Все бесплатно. Или, если хотите, вы можете добавить редактор с поддержкой COBOL (среди нескольких других функций), если добавите подключаемые модули IBM Z Open Development:

https://developer.ibm.com/mainframe/products/ibm-z-open-development/

Иэто тоже работает, бесплатно в течение 90 дней. По истечении 90 дней вы можете либо заплатить текущую цену, чтобы сохранить эти плагины, либо удалить их, и просто использовать базовый / бесплатный проводник для функций z / OS.

Может быть, это будет хорошей обратной связьюсвоему инструктору / профессору? Да, ваш первый опыт работы с любым языком программирования может быть (например) через emacs и эмулятор терминала. Да, вы можете написать код Apple Swift (например) с помощью emacs, ISPF или vi. Однако эти классические пользовательские интерфейсы не являются всеми любимыми новинками. Опять же, если вам нравится определенный интерфейс, и он работает для вас, нет проблем! Но с педагогической точки зрения, вероятно, лучше начать с чего-то более привычного для аудитории.

О редактировании: в качестве другого примера, если вам больше нравится Microsoft Visual Studio Code , тогда вы можетедобавьте IBM Z Open Editor бесплатно в эту IDE.

...