-1

フラットファイルを順番に読み取って出力ファイルに書き込むようにCOBOLプログラムを作成しようとしていますが、一度に1つのレコードしか読み取れず、次のレコードを読み取ることができません。どうすればよいですか。

これが私のコードです:

PROCEDURE DIVISION.                                           
    OPEN INPUT FILEX.                                         
    PERFORM READ-PARA THRU END-PARA UNTIL END-OF-FILE = 'Y'.  
    CLOSE FILEX.                                              
    STOP RUN.                                                 
READ-PARA.                                                    
    READ FILEX                                                
      AT END                                                  
    MOVE 'Y' TO END-OF-FILE                                   
    DISPLAY OFFCODE1                                          
    DISPLAY AGCODE1                                           
    DISPLAY POLNO1                                            
    DISPLAY EFFDATE1                                          
    DISPLAY EXPDATE                                           
    DISPLAY REPCODE                                           
    DISPLAY POLHOLDER1                                        
    DISPLAY LOCATION1                                         
    GO TO END-PARA.                                           
END-PARA.   

私は、スコープターミネーターを使用しようとしましたが、まだループできません'm取得S001ABENDここに私のコードがあります:

IDENTIFICATION DIVISION.             
PROGRAM-ID. SIMPLE.                  
ENVIRONMENT DIVISION.                
INPUT-OUTPUT SECTION.                
FILE-CONTROL.                        
 SELECT FILEX ASSIGN TO SYSUT1   
 FILE STATUS IS FS.              
DATA DIVISION.                       
FILE SECTION.                        
FD  FILEX.                           
01  FILEXREC.                        
02 OFFCODE1 PIC X(3).            
02 FILLER PIC X.                 
02 AGCODE1 PIC X(3).             
02 FILLER PIC X.                 
02 POLNO1 PIC X(6).              
02 FILLER PIC X.                 
02 EFFDATE1 PIC X(8).            
02 FILLER PIC X.                                        
02 EXPDATE PIC X(8).                                    
02 FILLER PIC X.                                        
02 REPCODE PIC X(1)                                     
02 FILLER PIC X.                                        
02 POLHOLDER1 PIC X(8).                                 
02 FILLER PIC X.                                        
02 LOCATION1 PIC X(9).                                  
02 FILLER PIC X(87).                                    
WORKING-STORAGE SECTION.                                    
77  FS PIC 9(2).                                            
01  WS-INDICATORS.                                          
 10  WS-EOF-IND                    PIC X(01) VALUE 'N'.  
     88  WS-END-OF-FILE                      VALUE 'Y'.  
PROCEDURE DIVISION.                                         
 OPEN INPUT FILEX.                                       
 PERFORM READ-PARA THRU END-PARA UNTIL WS-END-OF-FILE.   
 CLOSE FILEX. 
 STOP RUN.                         
READ-PARA.                            
 READ FILEX                        
   AT END                          
      MOVE 'Y' TO WS-EOF-IND.      
   DISPLAY OFFCODE1                
   DISPLAY AGCODE1                 
   DISPLAY POLNO1                  
   DISPLAY EFFDATE1                
   DISPLAY EXPDATE                 
   DISPLAY REPCODE                 
   DISPLAY POLHOLDER1              
   DISPLAY LOCATION1               
   IF WS-END-OF-FILE               
      GO TO END-PARA.            
  END-PARA.                             
 EXIT.                       

これでも試したもう1つの方法は、1つのレコードに対してのみ機能し、コードの実行中にS001ABENDを取得します。コードは次のとおりです。

   IDENTIFICATION DIVISION.                  
   PROGRAM-ID. ASSIGNMENT.                   
   ENVIRONMENT DIVISION.                     
   INPUT-OUTPUT SECTION.                     
   FILE-CONTROL.                             
   SELECT FILEX ASSIGN TO SYSUT1         
   DATA DIVISION.                            
   FILE SECTION.                             
   FD  FILEX.                                
   LABEL RECORDS ARE STANDARD            
   RECORD CONTAINS  140  CHARACTERS      
   BLOCK CONTAINS  00  RECORDS.          
     01  FILEXREC.                             
      02 OFFCODE1 PIC 9(3).                 
      02 FILLER PIC X.                      
      02 AGCODE1 PIC X(3).                  
      02 FILLER PIC X.                      
      02 POLNO1 PIC X(6).                   
      02 FILLER PIC X.                                      
      02 EFFDATE1 PIC X(8).                                 
      02 FILLER PIC X.                                      
      02 EXPDATE1 PIC X(8).                                 
      02 FILLER PIC X.                                      
      02 REPCODE1 PIC X(1).                                 
      02 FILLER PIC X.                                      
      02 POLHOLDER1 PIC X(8).                               
      02 FILLER PIC X.                                      
      02 LOCATION1 PIC X(9).                                
      02 FILLER PIC X(26).                                  
  WORKING-STORAGE SECTION.                                  
   01  WS-INDICATORS.                                        
   10  WS-EOF-IND                    PIC X(01) VALUE 'N'.
    88  WS-END-OF-FILE                      VALUE 'Y'.

   01  TEMP1.                                                
    02 OFFCODE2 PIC 9(3).                                 
    02 FILLER PIC X.                                      
    02 AGCODE2 PIC X(3).                                  
    02 FILLER PIC X.                                      
    02 POLNO2 PIC X(6).                                   
    02 FILLER PIC X.                                      
    02 EFFDATE2 PIC X(8).                                 
    02 FILLER PIC X.                                      
    02 EXPDATE2 PIC X(8).                                 
    02 FILLER PIC X.                                      
    02 REPCODE2 PIC X(1).                                 
    02 FILLER PIC X.                                      
    02 POLHOLDER2 PIC X(8).                               
    02 FILLER PIC X.                                      
    02 LOCATION2 PIC X(9).                                
    02 FILLER PIC X(26).                                  
 PROCEDURE DIVISION.                                       
 OPEN INPUT FILEX.                                     
 PERFORM READ-PARA THRU END-PARA UNTIL WS-END-OF-FILE. 
CLOSE FILEX.                                          
STOP RUN.                        
READ-PARA.                           
READ FILEX                       
     INTO TEMP1                  
  AT END                         
     MOVE 'Y' TO WS-EOF-IND.     
  DISPLAY OFFCODE1               
  DISPLAY AGCODE1                
  DISPLAY POLNO1                 
  DISPLAY EFFDATE1               
  DISPLAY EXPDATE1               
  DISPLAY REPCODE1               
  DISPLAY POLHOLDER1             
  DISPLAY LOCATION1              
        IF WS-END-OF-FILE        
           GO TO END-PARA.       
  END-PARA.                      
      EXIT. 
4

2 に答える 2

8

あなたは本当にあなたのEND-ターミネーターを使うべきです...END-PERFORM、END-IF、END-READなど。

問題については、推測すると、最初のレコードだけを読んでいるのではなく、すべてのレコードを読んでいて、最後のレコードだけを表示していると言えます。READステートメントにはATENDがあり、すべてが実行されますが、正常に読み取られたレコードをどう処理するかを指示するNOTATENDはありません。私は通常、READステートメントを次のようにコーディングします。

READ FILE
  AT END
    SET FILE-EOF TO TRUE
  NOT AT END
    PERFORM PROCESS-RECORD
END-READ

このようなパフォーマンスでそれをラップすると、それはかなりうまく機能します:

SET FILE-NOT-EOF TO TRUE
PERFORM UNTIL FILE-EOF
  READ FILE
    AT END
      SET FILE-EOF TO TRUE
    NOT AT END
      PERFORM PROCESS-RECORD
  END-READ
END-PERFORM

頑張ってください、それがあなたのためにうまくいくことを願っています。堅実なCOBOLを作成することは、非常に困難な場合があります。

于 2012-07-10T12:37:41.987 に答える
1

あなたはまだ待っていないと思います:-)

1 箇所のファイルは 140 ですが、定義は 79 しかありません。

ファイルステータスを使用しますが、チェックしません。ファイルが正常に開かない可能性があります。これは、FS フィールドをチェックした場合に発見できます (ずるい名前ですが、IBM の例からコピーした可能性があります)。

READ してファイルの終わりを取得すると、フラグを設定しますが、レコードを取得したかのように処理します。「物事」に応じて、これは間違ったデータを取得するか、異常終了します。

とにかくEND-PARAは直後なのでGO TO END-PARAに意味はありません。

戻って、NealB が提供したコードを見て、数か月前にうまくいったことを願っています...

于 2013-01-23T19:38:15.187 に答える