【问题标题】:COBOL outputting a blank file instead of expected outputCOBOL 输出一个空白文件而不是预期的输出
【发布时间】:2021-01-04 19:19:06
【问题描述】:

嘿,伙计们,我整天都在为此挠头,但无济于事。我正在运行一个 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的描述,要么是输出PDS没有空格,要么是Directory没有空格。看看输出文件,如果是 PDS,我建议压缩它。如果您使用 PDS 作为输出,则需要定期对其进行压缩以回收未使用的空间。见ibmmainframes.com/about23872.html

标签: cobol mainframe jcl


【解决方案1】:

SB14 是关闭的问题。 SB14 可以找到here 这个异常结束表示有伴随的消息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 文件。

【讨论】:

  • 谢谢你。我——我什至不知道我是怎么错过的。非常感谢。
【解决方案2】:

我不是 COBOL 人,但您的代码对我来说看起来很不正确。从READ-NEXT-RECORDREAD-RECORD 调用WRITE-RECORD。但这不是主要问题。

输出中只有一条记录的原因是WRITE-RECORD 中的CLOSE ACCT-RPT。每次重新打开数据集时,关闭和重新打开数据集都会覆盖以前的内容(除非您在 DD 语句中设置了 DISP=MOD)。

您似乎正在写信给 PDS 成员,所有关闭和重新打开最终都使用了导致 B14 ABEND 的所有空间。

重新思考你的逻辑。

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多