问题描述
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 区域。
不知道为什么我会收到这个错误。 早些时候,我使用相同的组数据项将记录添加到文件中,并且工作正常。 请帮忙!!
解决方法
虽然其他答案正确回答了您的问题,但为 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 来检索系统日期 和时间)
- 关闭
- 删除
- 在控制台上显示
- 在系统打孔时显示
- 合并
- 打开
- 阅读
- 重新运行
- 重写
- 开始
- 停止文字
- 写
[...]
编码文件输入和输出:您必须使用 CICS 命令进行大多数输入和输出处理。因此,不要描述文件或代码 任何 OPEN、CLOSE、READ、START、REWRITE、WRITE 或 DELETE 语句。 相反,使用 CICS 命令来检索、更新、插入和删除 数据。
,READ MYFILE INTO FILERECORDS
是重复的,因为它们已经相互分配了。
要解决此问题,只需使用 READ MYFILE
(仅当您不想将其放入 INTO somewhere
而是将其放入其他地方时才使用 FILERECORDS
)。
@simon 的类似回答。
READ
已将该记录放入 MYFILE
的 01 定义中。当您希望将数据放置在 READ INTO
中的另一个区域时,使用 WORKING-STORAGE
。对 READ INTO
区域执行 FD
只是将数据移过自身。
我总是被教导做一个 READ INTO
一个我定义的区域或者是 COPYBOOK
中的一个 WORKING-STORAGE
以将 I/O 区域与数据操作分开。
在汇编程序中,您使用 READ
执行的操作相当于 GET LOCATE
,而不是 GET MOVE
类型的操作。