'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
访问记录。下面的差异显示了附加文件以及该文件的 OPEN
和 CLOSE
语句。
此外,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
段落可以通过在 READ
或 RETURN
语句中使用 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 循环。
当下面的代码 运行 根据输入文件输出所有获得奖金的人的报告时,我收到错误,'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
访问记录。下面的差异显示了附加文件以及该文件的 OPEN
和 CLOSE
语句。
此外,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
段落可以通过在 READ
或 RETURN
语句中使用 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 循环。