COBOL代码输出重复最后一条记录:如何修改消除重复?
COBOL程序输出重复最后一条记录的修复方案
问题根源
你的程序在读取完所有10条记录后,仍然执行了一次写入操作:PERFORM循环是先执行MAIN-PARA,再判断WS-EOF是否为'Y'。当第10条记录读取完成后,WS-EOF仍为初始值(非'Y'),循环会再次触发MAIN-PARA:这次READ触发AT END分支设置WS-EOF为'Y',但后续的UNSTRING和WRITE-PARA没有被跳过,直接使用上一次循环保留的WS变量值写入了重复记录。
修改方案
将记录处理(UNSTRING)和写入(WRITE-PARA)的逻辑严格限制在成功读取到记录的分支中,即NOT AT END的范围内,避免AT END时执行多余操作。
修改后的完整代码
*----------------------------------------------------------------- PROCEDURE DIVISION. *----------------------------------------------------------------- OPEN INPUT VA0001R. OPEN OUTPUT VA0001W. PERFORM MAIN-PARA UNTIL WS-EOF = 'Y'. PERFORM CLOSE-PARA. CLOSE-PARA. CLOSE VA0001R. CLOSE VA0001W. GOBACK. MAIN-PARA. READ VA0001R INTO WS-VA0001W AT END MOVE 'Y' TO WS-EOF NOT AT END DISPLAY "WS-VA0001W=" WS-VA0001W MOVE SPACES TO WS-VA0001W. UNSTRING REG-VA0001R DELIMITED BY ";" INTO WS-CODISIN,WS-MARKETING-REPORT,WS-LAST-UPDATE1, WS-ANNUAL-REPORT,WS-LAST-UPDATE2,WS-STATUTES, WS-LAST-UPDATE3,WS-FULL-BROCHURE,WS-LAST-UPDATE4, WS-SEMI-ANNUAL-REPORT,WS-LAST-UPDATE5,WS-SIMPIE-BROCHURE, WS-LAST-UPDATE6. PERFORM WRITE-PARA. WRITE-PARA. MOVE SPACES TO REG-VA0001W. MOVE WS-CODISIN TO CODISIN. MOVE WS-MARKETING-REPORT TO MARKETING-REPORT. MOVE WS-LAST-UPDATE1 TO LAST-UPDATE1. MOVE WS-ANNUAL-REPORT TO ANNUAL-REPORT. MOVE WS-LAST-UPDATE2 TO LAST-UPDATE2. MOVE WS-STATUTES TO STATUTES. MOVE WS-LAST-UPDATE3 TO LAST-UPDATE3. MOVE WS-FULL-BROCHURE TO FULL-BROCHURE. MOVE WS-LAST-UPDATE4 TO LAST-UPDATE4. MOVE WS-SEMI-ANNUAL-REPORT TO SEMI-ANNUAL-REPORT. MOVE WS-LAST-UPDATE5 TO LAST-UPDATE5. MOVE WS-SIMPIE-BROCHURE TO SIMPIE-BROCHURE. MOVE WS-LAST-UPDATE6 TO LAST-UPDATE6. WRITE REG-VA0001W.
关键修改点
- 把
DISPLAY、MOVE SPACES、UNSTRING、PERFORM WRITE-PARA全部缩进放入NOT AT END分支下,确保只有读取到有效记录时才执行这些操作 - 移除了多余的
CONTINUE语句(COBOL中NOT AT END分支默认会继续执行后续代码,但这里我们把后续代码都放到分支里,所以不需要CONTINUE)
内容的提问来源于stack exchange,提问作者Mallikarjuna Reddy
相关产品推荐
相关产品推荐

