COBOL 输出一个空白文件而不是预期的输出
COBOL outputting a blank file instead of expected output
嘿伙计们,我整天都在为这个问题挠头,但无济于事。我是 运行 一个 COBol 程序, 应该 从一个文件中获取输入,如果满足某些条件,则将其输出到另一个文件。
这是 PROCEDURE DIVISION.
PROCEDURE DIVISION.
*
A000-START.
OPEN INPUT CUST-RECS.
OPEN OUTPUT ACCT-RPT.
PERFORM A000-WRITE-FIRST.
PERFORM READ-NEXT-RECORD.
* PERFORM WRITE-RECORD.
CLOSE ACCT-RPT.
CLOSE CUST-RECS.
STOP RUN.
*
A000-WRITE-FIRST.
DISPLAY "WRITE-FIRST".
MOVE 2 TO REC-COUNT.
WRITE PRT-REP-DONE FROM HEADER-1.
WRITE PRT-REP-DONE FROM HEADER-2.
WRITE PRT-REP-DONE FROM HEADER-3.
WRITE PRT-REP-DONE FROM HEADER-4.
*
READ-NEXT-RECORD.
PERFORM READ-RECORD
PERFORM UNTIL LASTREC = 'Y'
PERFORM WRITE-RECORD
PERFORM READ-RECORD
END-PERFORM.
*
WRITE-RECORD.
DISPLAY "WRITE-RECORD called" FIRST-NAME.
MOVE SPACES TO PRT-REP-DONE.
MOVE REC-COUNT TO PRT-RECS.
MOVE FIRST-NAME TO PRT-NAME-FST.
MOVE LAST-NAME TO PRT-NAME-LST.
MOVE BALANCE TO PRT-BALANCE.
WRITE PRT-REP-DONE.
CLOSE ACCT-RPT.
READ-RECORD.
READ CUST-RECS
AT END MOVE 'Y' TO LASTREC
IF (FUNCTION NUMVAL-C(BALANCE) IS > 8500000)
THEN
DISPLAY "BALANCE: " BALANCE
ADD 1 TO REC-COUNT
PERFORM WRITE-RECORD
END-IF
END-READ.
在我的输出文件中,我只得到 1 个空行。以及 SB14 的 ABEND 代码。我以前能得到一些输出,但现在什么都没有了。
SB14 是关闭的问题。可以找到SB14here This abend indicates there is the accompanying messace IEC217I
关于代码,您似乎正在关闭输出文件 ACCT-RPT
WRITE-RECORD
,这可能是您的输出文件。
WRITE-RECORD.
DISPLAY "WRITE-RECORD called" FIRST-NAME.
MOVE SPACES TO PRT-REP-DONE.
MOVE REC-COUNT TO PRT-RECS.
MOVE FIRST-NAME TO PRT-NAME-FST.
MOVE LAST-NAME TO PRT-NAME-LST.
MOVE BALANCE TO PRT-BALANCE.
WRITE PRT-REP-DONE.
CLOSE ACCT-RPT.
我的猜测是它抱怨 closing
文件两次。
我不是 COBOL 人,但你的代码对我来说看起来很不正确。 WRITE-RECORD
从 READ-NEXT-RECORD
以及 READ-RECORD
调用。但这不是主要问题。
输出中只有一条记录的原因是WRITE-RECORD
中的CLOSE ACCT-RPT
。每次重新打开数据集时,关闭并重新打开数据集都会覆盖以前的内容(除非您在 DD 语句中设置了 DISP=MOD)。
您似乎是在给 PDS 成员写信,所有关闭和重新打开最终都使用了所有导致 B14 ABEND 的 space。
重新思考你的逻辑。
嘿伙计们,我整天都在为这个问题挠头,但无济于事。我是 运行 一个 COBol 程序, 应该 从一个文件中获取输入,如果满足某些条件,则将其输出到另一个文件。
这是 PROCEDURE DIVISION.
PROCEDURE DIVISION.
*
A000-START.
OPEN INPUT CUST-RECS.
OPEN OUTPUT ACCT-RPT.
PERFORM A000-WRITE-FIRST.
PERFORM READ-NEXT-RECORD.
* PERFORM WRITE-RECORD.
CLOSE ACCT-RPT.
CLOSE CUST-RECS.
STOP RUN.
*
A000-WRITE-FIRST.
DISPLAY "WRITE-FIRST".
MOVE 2 TO REC-COUNT.
WRITE PRT-REP-DONE FROM HEADER-1.
WRITE PRT-REP-DONE FROM HEADER-2.
WRITE PRT-REP-DONE FROM HEADER-3.
WRITE PRT-REP-DONE FROM HEADER-4.
*
READ-NEXT-RECORD.
PERFORM READ-RECORD
PERFORM UNTIL LASTREC = 'Y'
PERFORM WRITE-RECORD
PERFORM READ-RECORD
END-PERFORM.
*
WRITE-RECORD.
DISPLAY "WRITE-RECORD called" FIRST-NAME.
MOVE SPACES TO PRT-REP-DONE.
MOVE REC-COUNT TO PRT-RECS.
MOVE FIRST-NAME TO PRT-NAME-FST.
MOVE LAST-NAME TO PRT-NAME-LST.
MOVE BALANCE TO PRT-BALANCE.
WRITE PRT-REP-DONE.
CLOSE ACCT-RPT.
READ-RECORD.
READ CUST-RECS
AT END MOVE 'Y' TO LASTREC
IF (FUNCTION NUMVAL-C(BALANCE) IS > 8500000)
THEN
DISPLAY "BALANCE: " BALANCE
ADD 1 TO REC-COUNT
PERFORM WRITE-RECORD
END-IF
END-READ.
在我的输出文件中,我只得到 1 个空行。以及 SB14 的 ABEND 代码。我以前能得到一些输出,但现在什么都没有了。
SB14 是关闭的问题。可以找到SB14here This abend indicates there is the accompanying messace IEC217I
关于代码,您似乎正在关闭输出文件 ACCT-RPT
WRITE-RECORD
,这可能是您的输出文件。
WRITE-RECORD. DISPLAY "WRITE-RECORD called" FIRST-NAME. MOVE SPACES TO PRT-REP-DONE. MOVE REC-COUNT TO PRT-RECS. MOVE FIRST-NAME TO PRT-NAME-FST. MOVE LAST-NAME TO PRT-NAME-LST. MOVE BALANCE TO PRT-BALANCE. WRITE PRT-REP-DONE. CLOSE ACCT-RPT.
我的猜测是它抱怨 closing
文件两次。
我不是 COBOL 人,但你的代码对我来说看起来很不正确。 WRITE-RECORD
从 READ-NEXT-RECORD
以及 READ-RECORD
调用。但这不是主要问题。
输出中只有一条记录的原因是WRITE-RECORD
中的CLOSE ACCT-RPT
。每次重新打开数据集时,关闭并重新打开数据集都会覆盖以前的内容(除非您在 DD 语句中设置了 DISP=MOD)。
您似乎是在给 PDS 成员写信,所有关闭和重新打开最终都使用了所有导致 B14 ABEND 的 space。
重新思考你的逻辑。