2012-05-02 7 views
2

こんにちは私はcobolの初心者で、いくつかの宿題が必要です。私は出力にアドレスラベルを印刷するプログラムを書こうとしています。しかし、出力にはヘッダー、ページ番号、日付がなければなりません。私は正常にラベルの形式でアドレスを印刷するプログラムを持っているが、上に表示する見出し行(ページと日付)を取得するように見えることはできません。私のプログラムでは、データファイルのアクセスモードが間違っているというエラーコードが表示されます。私はこれが何を意味するのか不明です。ここに私のプログラムです。私はちょうどアドレスの上に見出し行を試して取得するために日付部分を取り除きました。 *編集:私は "印刷ヘッダー"のためのオープンとクローズを追加しましたが、今は私にエラーコード "ファイルロック"を与える誰もこれをいくつかの光を当てることができます。 PRINT-HEADER-OUTファイルを使用すると、ステートメントWRITEのREPORT-OUTを実行したときに開いていないので、COBOLのアドレスラベルプログラムへのヘッダーの追加

ENVIRONMENT DIVISION. 
    INPUT-OUTPUT SECTION. 
    FILE-CONTROL. 

    SELECT LABEL-FILE-IN 
    ASSIGN TO 'C0603.DAT' 
    ORGANIZATION IS LINE SEQUENTIAL. 

    SELECT LABEL-FILE-OUT 
    ASSIGN TO 'C0603.RPT' 
    ORGANIZATION IS LINE SEQUENTIAL. 

    SELECT PRINT-HEADER-OUT 
    ASSIGN TO 'C0603.RPT' 
    ORGANIZATION IS LINE SEQUENTIAL. 

    DATA DIVISION. 
    FILE SECTION. 


    FD LABEL-FILE-IN. 
    01 LABEL-RECORD-IN. 
    05 CUST-NAME-IN PIC X(20). 
    05 ADDRESS-IN PIC X(20). 
    05 CITY-STATE-ZIP-IN PIC X(20). 

    FD LABEL-FILE-OUT. 
    01 LABEL-RECORD-OUT. 
    05 PRINT-LABEL-OUT PIC X(20). 

    FD PRINT-HEADER-OUT. 
    01 REPORT-OUT     PIC X(80). 


      WORKING-STORAGE SECTION. 
    01 ARE-THERE-MORE-RECORDS PIC X(3) VALUE 'YES'. 

    01 HEADING-LINE1. 
     05       PIC X(40) VALUE SPACES. 
     05       PIC X(12) VALUE 
      "MAILING LIST". 

    01 DATE-WS. 
     05 MONTH-WS     PIC XX. 
     05 YEAR-WS     PIC XX. 

    01 DATE-WS-OUT. 
     05       PIC X(45) VALUE SPACES. 
     05 MONTH-WS-OUT    PIC XX. 
     05       VALUE "/". 
     05 YEAR-WS-OUT    PIC XX. 


      PROCEDURE DIVISION. 

    000-MAIN-MODULE. 
     PERFORM 100-INITIALIZATION-MODULE. 
     PERFORM 200-PROCESS-ONE-RECORD 
      UNTIL ARE-THERE-MORE-RECORDS = "NO ". 
     PERFORM 900-TERMINATION-MODULE. 
     STOP RUN. 

    100-INITIALIZATION-MODULE. 
     OPEN OUTPUT PRINT-HEADER-OUT 
     OPEN INPUT LABEL-FILE-IN 
     OPEN OUTPUT LABEL-FILE-OUT 
     ACCEPT DATE-WS FROM DATE. 
     MOVE MONTH-WS TO MONTH-WS-OUT. 
     MOVE YEAR-WS TO YEAR-WS-OUT. 
     PERFORM 600-READ-MODULE. 
     PERFORM 300-TOP-OF-PAGE-MODULE. 

    200-PROCESS-ONE-RECORD. 
     MOVE SPACES TO PRINT-LABEL-OUT 

     MOVE CUST-NAME-IN TO PRINT-LABEL-OUT 
     WRITE LABEL-RECORD-OUT 

     MOVE ADDRESS-IN TO PRINT-LABEL-OUT 
     WRITE LABEL-RECORD-OUT 

     MOVE CITY-STATE-ZIP-IN TO PRINT-LABEL-OUT 
     WRITE LABEL-RECORD-OUT 


    PERFORM 600-READ-MODULE. 

    300-TOP-OF-PAGE-MODULE. 
     MOVE HEADING-LINE1 TO REPORT-OUT. 
     WRITE REPORT-OUT AFTER ADVANCING 9 LINES. 
     MOVE DATE-WS-OUT TO REPORT-OUT. 
     WRITE REPORT-OUT AFTER ADVANCING 1 LINES. 


    600-READ-MODULE. 
     READ LABEL-FILE-IN 
      AT END MOVE "NO " TO ARE-THERE-MORE-RECORDS 
     END-READ. 

    900-TERMINATION-MODULE. 
     CLOSE PRINT-HEADER-OUT. 
     CLOSE LABEL-FILE-IN. 
     CLOSE LABEL-FILE-OUT. 

答えて

3

あなたが持っている問題は、LABEL-FILEHEADER-FILEの両方が同じ物理的なファイル( 'C0603.RPT')を指していることだと思います。あなたはこれを行うことができますが、一度に1つだけ開くことができます。これは別の の名前で2回目を開こうとすると、「ファイルがロックされました」というメッセージの送信元が です。

これを実行する一般的な方法は、1つのファイルを開き、それに複数のレコード定義を書き込んで に書き込むことです。

ドロップ:

SELECT PRINT-HEADER-OUT 
    ASSIGN TO 'C0603.RPT' 
    ORGANIZATION IS LINE SEQUENTIAL. 

とヘッダーレコードを含めるようにFDのためのLABEL-FILE-OUTを変更...

FD LABEL-FILE-OUT. 
    01. 
     05 LABEL-BUFFER    PIC X(80). 
     05 LABEL-RECORD-OUT REDEFINES LABEL-BUFFER. 
      10 PRINT-LABEL-OUT PIC X(20). 
      10     PIC X(60). 
     05 PRINT-HEADER-OUT REDEFINES LABEL-BUFFER. 
      10 REPORT-OUT  PIC X(80). 

あり、これを行う他の方法がありますが、基本的な最大の出力レコードと同じ大きさの で、複数の用途(LABELまたはHEADER)の場合はREDEFINEという出力バッファを持つことです。

ラベル行またはヘッダ行を書くときだけWRITE LABEL-BUFFERを使用し、それぞれが、それが適切にsubordiante データ項目のいずれかを再投入する前に初期化されることを確認するために、書き込み後 それにスペースを移動します。

0

「私は、データファイルの誤ったアクセス・モードを持っていることを示すエラーコードは」です。すべてのファイルは、使用する前にOPENされていなければなりません。作業が終わったら、いつでもCLOSEする必要があります。

+0

"FILE LOCKED"というエラーが何を意味しているのか知っていますか?私は上記のコードを更新 –

+0

悪い更新 –

関連する問題