'WRITE not allowed' 打开文件时收到错误

'WRITE not allowed' error received when file is open

当下面的代码 运行 根据输入文件输出所有获得奖金的人的报告时,我收到错误,'WRITE not allowed, file not open for output (status = 48)' on ln 159。

我曾尝试在 500-HEADING 模块中打开文件,但收到一条错误消息 'file already open (status = 41)' 并收到将 OPEN 语句移至 100-MAIN 模块的原始错误。使用 I-O、INPUT-OUTPUT 和 EXTEND return 语法错误。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. ASSIGNMENT9_1_SORT.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT PAYROLL-MASTER ASSIGN TO 'CH0901-UNSORTED.DAT'
           ORGANIZATION IS LINE SEQUENTIAL.
           SELECT WORK-FILE ASSIGN TO 'TEMP.DAT'
           ORGANIZATION IS LINE SEQUENTIAL.
           SELECT BONUS-REPORT ASSIGN TO 'BONUS REPORT SORTED.LST'
           ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD  PAYROLL-MASTER.
       01  PAYROLL-REC.
           05 EMP-NO-IN                 PIC X(5).
           05 NAME-IN                   PIC X(20).
           05 TERRITORY-NO-IN           PIC XX.
           05 OFFICE-NO-IN              PIC XX.
           05 ANNUAL-SALARY-IN          PIC 9(6).
           05                           PIC X(29).
           05 DATE-HIRED-IN.
                10 MONTH-IN             PIC 99.
                10 DAY-IN               PIC 99.
                10 YEAR-IN              PIC 9999.
           05                           PIC X(10).
       FD  BONUS-REPORT.
       01  BONUS-PRINT                  PIC X(80).
       SD  WORK-FILE.
       01  SORT-REC.
           05 EMP-NO                    PIC X(5).
           05 S-NAME                    PIC X(20).
           05 TERR                      PIC XX.
           05 OFFICE                    PIC XX.
           05 ANNUAL-SALARY             PIC 9(6).
           05                           PIC X(29).
           05 DATE-HIRED.
                10 S-MONTH              PIC 99.
                10 S-DAY                PIC 99.
                10 S-YEAR               PIC 9999.
           05                           PIC X(10).
       WORKING-STORAGE SECTION.
       01  BONUS-REC.
           05 EMP-NO-OUT                PIC X(5).
           05 NAME-OUT                  PIC X(20).
           05 TERRITORY-NO-OUT          PIC XX.
           05 OFFICE-NO-OUT             PIC XX.
           05 ANNUAL-SALARY-OUT         PIC 9(6).
           05                           PIC X(29).
           05 DATE-HIRED-OUT.
               10 MONTH-OUT             PIC 99.
               10 DAY-OUT               PIC 99.
               10 YEAR-OUT              PIC 9999.
           05                           PIC X(10).
       01  WS-DATE.
           05 WS-YEAR                   PIC 9999.
           05 WS-MONTH                  PIC 99.
           05 WS-DAY                    PIC 99.
       01  HEADER1.
           05                           PIC X(40) VALUE SPACES.
           05                           PIC X(15) VALUE 'BONUS REPORT'.
           05                           PIC X(5) VALUE SPACES.
           05                           PIC X(5) VALUE 'PAGE '.
           05 PAGE-NO                   PIC 99 VALUE 1.
           05                           PIC XXX.
           05 TODAYS-DATE.
              10 MONTH-FIELD            PIC 99.
              10                        PIC X VALUE '/'.
              10 DAY-FIELD              PIC XX.
              10                        PIC X VALUE '/'.
              10 YEAR-FIELD             PIC 9999.
       01  BLANK-LINE                          PIC X(80).
       01  FIRST-RECORD                 PIC X VALUE 'Y'.
       01  HEADER2.
           05                           PIC X(10) VALUE SPACES.
           05                           PIC X(13) VALUE 'TERRITORY --'.
           05 TERRITORY-NO              PIC 99.
       01  HEADER3.
           05                           PIC X(20) VALUE SPACES.
           05                           PIC X(10) VALUE 'OFFICE --'.
           05 OFFICE-NO                 PIC 99.
       01  HEADER4.
           05                           PIC X(10) VALUE SPACES.
           05                           PIC X(15) VALUE 'EMPLOYEE NAME'.
           05                           PIC X(5) VALUE SPACES.
           05                           PIC X(5) VALUE 'BONUS'.
       01  DATA1.
           05                           PIC X(6) VALUE SPACES.
           05 NAME                      PIC X(20).
           05                           PIC XXXX.
           05 BONUS                     PIC $ZZ,ZZZ.99 VALUE ZEROES.
       01  ARE-THERE-MORE-RECORDS       PIC X VALUE 'Y'.
       01  LINE-COUNT                   PIC 99 VALUE 1.

       PROCEDURE DIVISION.
       100-MAIN.
           SORT WORK-FILE
             ON ASCENDING KEY TERR
             ON ASCENDING KEY OFFICE
             USING PAYROLL-MASTER
             GIVING BONUS-REPORT
           PERFORM 200-INPUT
           STOP RUN.

       200-INPUT.
           OPEN INPUT BONUS-REPORT
           MOVE FUNCTION CURRENT-DATE TO WS-DATE
           MOVE WS-YEAR TO YEAR-FIELD
           MOVE WS-MONTH TO MONTH-FIELD
           MOVE WS-DAY TO DAY-FIELD
           PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'N'
                READ BONUS-REPORT NEXT RECORD
                   AT END
                      MOVE 'N' TO ARE-THERE-MORE-RECORDS
                   NOT AT END
                      PERFORM 300-MOVE
                      PERFORM 400-CALC
                END-READ
           CLOSE BONUS-REPORT
           END-PERFORM.

       300-MOVE.
           MOVE EMP-NO-IN TO EMP-NO-OUT
           MOVE NAME-IN TO NAME-OUT
           MOVE TERRITORY-NO-IN TO TERRITORY-NO-OUT
           MOVE OFFICE-NO-IN TO OFFICE-NO-OUT
           MOVE ANNUAL-SALARY-IN TO ANNUAL-SALARY-OUT
           MOVE DATE-HIRED-IN TO DATE-HIRED-OUT.

       400-CALC.
           MOVE ZEROES TO BONUS
           IF YEAR-OUT IS LESS THAN 1994
               COMPUTE BONUS = ANNUAL-SALARY-OUT * 0.10
           END-IF
           EVALUATE TRUE
             WHEN FIRST-RECORD = 'Y'
                MOVE TERRITORY-NO-OUT TO TERRITORY-NO
                MOVE OFFICE-NO-OUT TO OFFICE-NO
                PERFORM 500-HEADING
                MOVE NAME-OUT TO NAME
                WRITE BONUS-PRINT FROM DATA1
                ADD 1 TO LINE-COUNT
                MOVE 'N' TO FIRST-RECORD
             WHEN FIRST-RECORD = 'N'
                MOVE TERRITORY-NO-OUT TO TERRITORY-NO
                MOVE OFFICE-NO-OUT TO OFFICE-NO
                MOVE NAME-OUT TO NAME
                IF LINE-COUNT > 10
                   MOVE 1 TO LINE-COUNT
                   ADD 1 TO PAGE-NO
                   PERFORM 500-HEADING
                END-IF
           WRITE BONUS-PRINT FROM DATA1
           ADD 1 TO LINE-COUNT
           END-EVALUATE.

       500-HEADING.
           WRITE BONUS-PRINT FROM BLANK-LINE
           WRITE BONUS-PRINT FROM HEADER1
           WRITE BONUS-PRINT FROM BLANK-LINE
           WRITE BONUS-PRINT FROM HEADER2
           WRITE BONUS-PRINT FROM BLANK-LINE
           WRITE BONUS-PRINT FROM HEADER3
           WRITE BONUS-PRINT FROM BLANK-LINE
           WRITE BONUS-PRINT FROM BLANK-LINE
           WRITE BONUS-PRINT FROM HEADER4.
`

改变

       OPEN INPUT BONUS-REPORT

       OPEN OUTPUT BONUS-REPORT

经进一步检查发现添加错误。

SORT 语句应该创建不同的文件用作输入,而不是您打算用于输出的文件。或者,正如@Jim Castro 在另一个答案中暗示的那样,使用 OUTPUT PROCEDURE 访问记录。下面的差异显示了附加文件以及该文件的 OPENCLOSE 语句。

此外,CLOSE 语句需要从 PERFORM 中删除。 @Jim Castro 也注意到了。

最后,END-EVALUATE需要放在WRITE语句之前。

以下是识别更改的差异实用程序的输出。 OLD 是您发布的程序,NEW 是我应用更改后的程序。

* Text File Comparison
*-------------------------------------------------------------------------------
* 000008/000008: mis-matched records
* OLD :-
           SELECT WORK-FILE ASSIGN TO 'TEMP.DAT'
           ORGANIZATION IS LINE SEQUENTIAL.
* NEW :-
           SELECT WORK-FILE ASSIGN TO 'TEMP.DAT'.
           SELECT TEMP-BONUS-FILE ASSIGN TO "TEMP-BONUS.DAT"
           ORGANIZATION LINE SEQUENTIAL.
*-------------------------------------------------------------------------------
* 000027/000028: extra NEW records :-
       FD  TEMP-BONUS-FILE.
       01  TEMP-BONUS-REC.
           05 T-EMP-NO                  PIC X(5).
           05 T-NAME                    PIC X(20).
           05 T-TERR                    PIC XX.
           05 T-OFFICE                  PIC XX.
           05 T-ANNUAL-SALARY           PIC 9(6).
           05                           PIC X(29).
           05 T-DATE-HIRED.
                10 T-MONTH              PIC 99.
                10 T-DAY                PIC 99.
                10 T-YEAR               PIC 9999.
           05                           PIC X(10).
*-------------------------------------------------------------------------------
* 000102/000116: mis-matched records
* OLD :-
             GIVING BONUS-REPORT
* NEW :-
             GIVING TEMP-BONUS-FILE
*-------------------------------------------------------------------------------
* 000107/000121: mis-matched records
* OLD :-
           OPEN INPUT BONUS-REPORT
* NEW :-
           OPEN INPUT TEMP-BONUS-FILE
               OUTPUT BONUS-REPORT
*-------------------------------------------------------------------------------
* 000113/000128: mis-matched records
* OLD :-
                READ BONUS-REPORT NEXT RECORD
* NEW :-
                READ TEMP-BONUS-FILE NEXT RECORD
*-------------------------------------------------------------------------------
* 000120/000135: mis-matched records
* OLD :-
           CLOSE BONUS-REPORT
           END-PERFORM.

       300-MOVE.
           MOVE EMP-NO-IN TO EMP-NO-OUT
           MOVE NAME-IN TO NAME-OUT
           MOVE TERRITORY-NO-IN TO TERRITORY-NO-OUT
           MOVE OFFICE-NO-IN TO OFFICE-NO-OUT
           MOVE ANNUAL-SALARY-IN TO ANNUAL-SALARY-OUT
           MOVE DATE-HIRED-IN TO DATE-HIRED-OUT.
* NEW :-
           END-PERFORM
           CLOSE BONUS-REPORT TEMP-BONUS-FILE.

       300-MOVE.
           MOVE T-EMP-NO TO EMP-NO-OUT
           MOVE T-NAME TO NAME-OUT
           MOVE T-TERR TO TERRITORY-NO-OUT
           MOVE T-OFFICE TO OFFICE-NO-OUT
           MOVE T-ANNUAL-SALARY TO ANNUAL-SALARY-OUT
           MOVE T-DATE-HIRED TO DATE-HIRED-OUT.
*-------------------------------------------------------------------------------
* 000154/000169: mis-matched records
* OLD :-
           WRITE BONUS-PRINT FROM DATA1
           ADD 1 TO LINE-COUNT
           END-EVALUATE.
* NEW :-
           END-EVALUATE
           WRITE BONUS-PRINT FROM DATA1
           ADD 1 TO LINE-COUNT.
*-------------------------------------------------------------------------------

我应该补充一点,300-MOVE 段落可以通过在 READRETURN 语句中使用 INTO BONUS-REC 来替换;如

    READ TEMP-BONUS-FILE NEXT RECORD INTO BONUS-REC

    RETURN SORT-REC INTO BONUS-REC

第一次尝试不错,但您做错了很多事情。如果 BONUS-REPORT 是程序的最终格式化输出,则不能将其作为输入打开。有些文件是 I-O 但这里不是这种情况。

我建议改用 SORT 动词和 USING with OUTPUT PROCEDURE IS 语句版本。 RETURN SORT-REC 然后格式化并写入奖励报告。您必须更改您的 300 和 400 个段落才能移动正确的字段,但它最终应该适合您。

   PROCEDURE DIVISION.
   100-MAIN.

       SORT WORK-FILE
         ON ASCENDING KEY TERR
         ON ASCENDING KEY OFFICE
         USING PAYROLL-MASTER
         OUTPUT PROCEDURE IS PERFORM 200-OUTPUT

       GOBACK.

   200-OUTPUT.
       OPEN OUTPUT BONUS-REPORT
       MOVE FUNCTION CURRENT-DATE TO WS-DATE
       MOVE WS-YEAR TO YEAR-FIELD
       MOVE WS-MONTH TO MONTH-FIELD
       MOVE WS-DAY TO DAY-FIELD

       PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'N'
             RETURN SORT-REC INTO BONUS-REC              
               AT END
                  MOVE 'N' TO ARE-THERE-MORE-RECORDS
               NOT AT END
                  PERFORM 400-CALC
            END-RETURN
       END-PERFORM.

       CLOSE BONUS-REPORT.

请注意:将 BONUS-REPORT 的结尾移出 PERFORM 循环。