You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 20:23:14