在COBOL程序中获取重叠错误

在COBOL程序中获取重叠错误,cobol,mainframe,zos,gnucobol,cics,Cobol,Mainframe,Zos,Gnucobol,Cics,Cobol程序: PROGRAM-ID. SCHPROG. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT MYFILE ASSIGN TO INDD ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL. DATA DIVIS

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区域

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

将我的文件读入文件记录
是重复的,因为这些记录已相互分配。

要解决这个问题,只需使用
readmyfile
(只有当您不想将
文件记录放在
FILERECORDS
,而是放在其他地方时,才会使用

类似于@simon的答案

READ
已将记录放入
MYFILE
中的01定义中<当您希望将数据放置在
工作存储
中的另一个区域时,使用code>读入
。对
FD
区域执行
读入
,只需将数据移动到自身上

我总是被教导对我在
工作存储
中定义的或是
文案
的一个区域进行
读取,以将I/O区域与数据操作分开


在汇编程序中,您使用
READ
执行的操作相当于
GET-LOCATE
,而不是
GET-MOVE
类型的操作。

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

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

  • 环境部门中的文件控制条目,除非 文件控制项用于排序语句
  • 文件部分 数据分割,除非文件部分用于排序语句
  • 主程序的用户指定参数使用声明(除 用于调试)
  • 这些COBOL语言语句:
  • 接受格式1: 数据传输(您可以使用format-2 ACCEPT检索系统日期 (和时间)
  • 接近
  • 删除
  • 在控制台上显示
  • 在SYSPUNCH上显示
  • 合并
  • 打开
  • 阅读
  • 重播
  • 重写
  • 开始
  • 停止文字
[……]

编码文件输入和输出:大多数输入和输出处理必须使用CICS命令。因此,不要描述文件或代码 任何打开、关闭、读取、启动、重写、写入或删除语句。 相反,使用CICS命令来检索、更新、插入和删除 数据


您能否共享更多的文件控制和工作存储定义?ROLLCI和NAMECO的定义在哪里?它们看起来像什么?更新了上面的完整程序。很好@cshneid