2012-05-02 39 views
2

您好,我是cobol的初學者,需要一些家庭作業幫助。我正在嘗試編寫一個在輸出上打印地址標籤的程序。但是在輸出中必須有一個標題,頁碼和日期。我已經成功地獲得了以標籤格式打印地址的程序,但似乎無法使標題行(包含頁面和日期)顯示在其上方。用我的程序的方式是有一個錯誤代碼,說明我對數據文件有錯誤的訪問模式。我不確定這意味着什麼。這是我的程序。我擺脫了日期部分只是爲了嘗試在地址之上獲取標題行。 *編輯:我已添加打開和關閉「打印頭」,但現在它給了我的錯誤代碼「文件鎖定」任何人都可以在這一點上闡明一些。在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')。你可以這樣做,但是其中只有一個可能一次打開。當您嘗試在不同的 名稱下第二次打開它時,這是 「文件鎖定」消息的來源。

這樣做的典型方法是打開一個文件,但有多個記錄定義,以便向其寫入 。

降:

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

的「錯誤代碼,說明我對數據文件中的錯誤的訪問模式」,是因爲當你執行該語句將報告寫入-OUT打印HEADER-OUT文件未打開。所有文件在使用之前都必須打開,並且在完成之後應始終關閉。

+0

你知道錯誤「FILE LOCKED」的含義嗎?我添加了 –

+0

虐待更新上面的代碼 –