在 COBOL 程序中出现重叠错误

Posted

技术标签:

【中文标题】在 COBOL 程序中出现重叠错误【英文标题】:Getting Overlapping error in COBOL program 【发布时间】:2021-04-06 13:58:28 【问题描述】:

Cobol 程序:

PROGRAM-ID. SCHPROG.            
ENVIRONMENT DIVISION.           
INPUT-OUTPUT SECTION.           
FILE-CONTROL.                   
    SELECT MYFILE ASSIGN TO INDD
    ORGANIZATION IS SEQUENTIAL  
    ACCESS MODE IS SEQUENTIAL.  
DATA DIVISION.                  
FILE SECTION.                   
FD MYFILE.                      
01 FILERECORDS.                 
    05 NAME    PIC A(10).       
    05 CLASS-IN PIC 9(1).       
    05 ROLL    PIC 9(5).        
WORKING-STORAGE SECTION.        
COPY SCHMAPA.                   
COPY SCHMAPB.                   
COPY SCHMAPC.                   
01 END-OF-FILE PIC A(3) VALUE 'NO'.
PROCEDURE DIVISION.                
000-MAIN-PARA.                     
    PERFORM 100-SEND-MAPA.         
    PERFORM 100-RECEIVE-MAPA.      
    IF CHOICEI = '1'               
    PERFORM 200-SEND-MAPB          
    PERFORM 200-RECEIVE-MAPB       
    PERFORM 200-SEND-MAPB          
    PERFORM 100-SEND-MAPA          
    END-IF.                        
    IF CHOICEI = '2'               
    PERFORM 300-SEND-MAPC          
    PERFORM 300-RECEIVE-MAPC       
    PERFORM 500-SRCH-REC           
    PERFORM 300-SEND-MAPC          
        PERFORM 100-SEND-MAPA              
    END-IF.                            
    STOP RUN.                          
100-SEND-MAPA.                         
    EXEC CICS                          
    SEND                               
    MAP('SCHOLA') MAPSET('SCHMAPA')    
    ERASE                              
    END-EXEC.                          
100-RECEIVE-MAPA.                      
    EXEC CICS                          
    RECEIVE                            
    MAP('SCHOLA') MAPSET('SCHMAPA')    
    END-EXEC.                          
200-SEND-MAPB.                         
    EXEC CICS                          
    SEND                               
         MAP('SCHOLB') MAPSET('SCHMAPB')     
     ERASE                               
     END-EXEC.                           
 200-RECEIVE-MAPB.                       
     EXEC CICS                           
     RECEIVE                             
     MAP('SCHOLB') MAPSET('SCHMAPB')     
     END-EXEC.                           
     PERFORM 400-FILE-PROCESS.           
 300-SEND-MAPC.                          
     EXEC CICS                           
     SEND                                
     MAP('SCHOLC') MAPSET('SCHMAPC')     
     ERASE                               
     END-EXEC.                           
 300-RECEIVE-MAPC.                       
     EXEC CICS                           
         RECEIVE                            
    MAP('SCHOLC') MAPSET('SCHMAPC')    
    END-EXEC.                          
400-FILE-PROCESS.                      
    OPEN OUTPUT MYFILE.                
    MOVE NAMEI TO NAME.                
    MOVE CLASSI TO CLASS-IN.           
    MOVE ROLLI TO ROLL.                
    WRITE FILERECORDS.                 
    CLOSE MYFILE.                      
    MOVE 'RECORD INSERTED' TO MSGBO.   
500-SRCH-REC.                          
    OPEN INPUT MYFILE.                 
    PERFORM UNTIL END-OF-FILE = 'YES'  
         READ MYFILE INTO FILERECORDS 
       AT END                     
        MOVE 'YES' TO END-OF-FILE 
       NOT AT END                 
        IF ROLL =  ROLLCI         
        MOVE NAME TO NAMECO       
        MOVE CLASS-IN TO CLASSCO  
        END-IF                    
     END-READ                     
  END-PERFORM.                    
  CLOSE MYFILE.            
    

出现错误。

IGYPA3043-E   Data-item "FILERECORDS (GROUP)" and record "FILERECORDS (GROUP)"
had overlapping storage.  Movement of data may not occur at execution time.

我已经提供了我的 cobol 程序。请检查并帮助我找到问题。

我正在从 Cics 区域更新文件并使用相同的文件来获取详细信息并放入 cics 区域。

不知道为什么我会收到此错误。 早些时候我使用相同的组数据项将记录添加到文件中,它工作正常。 请帮忙!!

【问题讨论】:

你能分享更多的 FILE-CONTROL 和 WORKING STORAGE 定义吗? ROLLCI 和 NAMECO 是在哪里定义的,它们是什么样的? 【参考方案1】:

虽然其他答案正确回答了您的问题,但为 CICS 编译需要一些限制,这些限制记录在 here 中,并于 2021 年 4 月 6 日在下面引用。您可能还想咨询CICS documentation,了解您的 CICS 版本和发行版。

限制:您不能运行具有面向对象的 COBOL 程序 CICS 中 Java™ 互操作性的语法。另外,如果你写 在 CICS 下运行的程序,不要使用以下代码:

环境部门中的文件控制条目,除非 FILE-CONTROL 条目用于 SORT 语句 文件部分 DATA DIVISION,除非 FILE SECTION 用于 SORT 语句 主程序 USE 声明的用户指定参数(除了 用于调试) 这些 COBOL 语言语句: 接受格式 1: 数据传输(您可以使用 format-2 ACCEPT 来检索系统日期 和时间) 关闭 删除 在控制台上显示 在 SYSPUNCH 上显示 合并 打开 阅读 重新运行 重写 开始 停止文字 写

[...]

编码文件输入和输出:您必须使用 CICS 命令进行大多数输入和输出处理。因此,不要描述文件或代码 任何 OPEN、CLOSE、READ、START、REWRITE、WRITE 或 DELETE 语句。 而是使用 CICS 命令来检索、更新、插入和删除 数据。

【讨论】:

好收获@cshneid【参考方案2】:

READ MYFILE INTO FILERECORDS 是重复的,因为它们已经相互分配。 要解决这个问题,只需使用 READ MYFILEINTO somewhere 仅在您不想将其放入 FILERECORDS 而是其他地方时使用)。

【讨论】:

【参考方案3】:

@simon 的类似回答。

READ 已经将记录放入MYFILE 的 01 定义中。当您希望将数据放在WORKING-STORAGE 的另一个区域中时,使用READ INTO。对FD 区域执行READ INTO 只是将数据移动到自身之上。

我总是被教导要做一个READ INTO 一个我定义的区域,或者在WORKING-STORAGE 中是一个COPYBOOK,以将 I/O 区域与数据操作分开。

在汇编程序中,您对READ 所做的操作相当于GET LOCATE,而不是GET MOVE 类型的操作。

【讨论】:

以上是关于在 COBOL 程序中出现重叠错误的主要内容,如果未能解决你的问题,请参考以下文章

在 iPad 中旋转全屏视频时,导航栏和状态栏之间出现奇怪的重叠错误

从 COBOL mainprog 调用 COBOL/DB2 subprog 从 subprog 的编译单元返回 CEE3204S 错误

尝试在 COBOL 中打开输出数据集时出现错误 IGZ0035S

g++ 错误:程序中出现杂散“\177”

SonarCOBOL插件执行错误

Open-COBOL Uknown错误