2

こんにちは私は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.
4

2 に答える 2

3

あなたが抱えている問題は、両方が物理的に同じファイル(「C0603.RPT」)LABEL-FILEを指していることだと思います。HEADER-FILEこれを行うことはできますが、一度に開くことができるのは 1 つのみです。これは、別の名前でもう一度開こうとしたときに「ファイルがロックされています」というメッセージが表示される原因です。

これを行う典型的な方法は、1 つのファイルを開き、そのファイルに書き込むための複数のレコード定義を用意することです。

落とす:

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

LABEL-FILE-OUT の FD を変更して、ヘッダー レコードを含めます...

    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).

これを行う方法は他にもありますが、基本的な考え方は、少なくとも最大の出力レコードと同じ大きさの出力バッファーを用意し、REDEFINEそれを複数の用途 (LABEL または HEADER) に使用することです。

ラベル行またはヘッダー行を書き込むときはWRITE LABEL-BUFFER、各書き込み後にスペースを使用してそこに移動し、下位のデータ項目を再入力する前に適切に初期化されるようにします。

于 2012-05-03T15:19:34.230 に答える
0

「データ ファイルのアクセス モードが間違っていることを示すエラー コード」は、ステートメント WRITE REPORT-OUT を実行したときに PRINT-HEADER-OUT ファイルが開かれていないためです。すべてのファイルは、使用する前に OPEN する必要があり、使用が終了したら常に CLOSE する必要があります。

于 2012-05-02T21:39:34.160 に答える