COBOL 程序不会在我的报告中输出详细信息行

Posted

技术标签:

【中文标题】COBOL 程序不会在我的报告中输出详细信息行【英文标题】:COBOL program won't output the detail lines in my report 【发布时间】:2019-10-13 20:11:58 【问题描述】:

编辑:想通了。我需要在 A420-COUNT-MARKS 结束时再次调用 read

编辑:在我通过 Vista TN3270 访问的 z/OS 大型机上工作。该程序是使用老师提供的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  
     .                    

【问题讨论】:

Plus1 为你创造的怀旧感觉(不得不在上个千年自己学习 Cobol) 我希望我不必学习它,因为我 90% 确定毕业后我永远不会使用它。 由于缺少此信息:您使用什么 COBOL 编译器?有理由不使用 REPORT WRITER 模块吗? @SimonSobisch 我正在开发 z/OS 大型机。我没有被指示使用该模块。程序使用老师提供的JCL提交。 添加一些诊断——在不同点显示计数,显示“Got Here A500”以确保真正执行,并且每次都“Wrote F3”......或者在现代系统上,设置断点和在代码执行时观察进度和值。代码概述得很清楚; COBOL 是我在 60 年代/70 年代学习的第 3 或第 4 种语言。仍然有很多 COBOL 在大型机上运行。 【参考方案1】:

很高兴你明白了,汤姆。

我希望你没有被关闭并且会进一步探索。仅供参考,虽然 ISPF、TSO/E 和其他经典用户界面仍然有效(有些人仍然喜欢它们,并且它们将“永远”继续工作),但现在开发人员经常使用并更喜欢图形用户界面。有一些免费的,例如 IBM Explorer for z/OS 及其 Remote System Explorer (RSE):

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

根据您的喜好(在 z/OS 上使用 RSE 部分),它可以在 Mac 或 PC(Linux 或 Windows)上单独运行。全部免费。或者,如果您愿意,如果您添加 IBM Z Open Development 插件,您可以添加更多“COBOL 感知”编辑器(以及其他几个功能):

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

这也有效,免费 90 天。在 90 天结束时,您可以支付现行价格以保留这些插件,也可以卸载它们并使用基本/免费的 Explorer for z/OS 功能。

也许这对你的导师/教授来说是一个很好的反馈?是的,您对任何编程语言的第一次体验可以(例如)通过 emacs 和终端模拟器。是的,您可以使用 emacs、ISPF 或 vi 编写 Apple Swift 代码(例如)。然而,这些经典的用户界面并不是每个人都喜欢的第一个。同样,如果您喜欢特定的 UI,并且它适合您,那没问题!但从教学的角度来看,最好从观众更熟悉的东西开始。

编辑时:再举一个例子,如果您碰巧更喜欢Microsoft Visual Studio Code,那么您可以免费将IBM Z Open Editor 添加到该IDE。

【讨论】:

这不能回答问题 - 虽然有趣的建议不适合本网站的问答模式。 能否更新一下 ZEOSEXPLORER 的链接,我找不到。【参考方案2】:

我通过在每个输出正在运行的函数的函数的开头放置一个 DISPLAY 来找出我的程序出了什么问题。我看到它在 A420-COUNT-MARKS 中处于无限循环中,并且我忘记在其末尾添加 PERFORM A410-READ-RECORD。

【讨论】:

很高兴能帮上忙。 Timothy 是对的——现在是时候将其他工具添加到您的环境中,以便更轻松地进行测试。

以上是关于COBOL 程序不会在我的报告中输出详细信息行的主要内容,如果未能解决你的问题,请参考以下文章

如何在访问报告详细信息部分中选择前 N 个或在 sql 子查询中选择前 N 个

cobol和C的数据类型对应,谁知道?详细点

VS 2003 CrystalReports - 详细信息部分问题

s-s-rS 报告需要根据数据集行显示 n 次

如何在我的离子4应用程序中检索特定的详细信息新闻

访问 2003 年报告详细信息