Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops COBOL-EXIT语句异常行为_Loops_Exit_Cobol - Fatal编程技术网

Loops COBOL-EXIT语句异常行为

Loops COBOL-EXIT语句异常行为,loops,exit,cobol,Loops,Exit,Cobol,我在用COBOL编写代码时遇到了一个奇怪的问题 我对这些执行语句进行了编码: PERFORM 000-INITIAL THRU 000-INITIAL-EXIT. PERFORM 100-MAIN-PROCESS THRU 100-MAIN-PROCESS-EXIT UNTIL END-OF-FILE. PERFORM 900-END-PGM THRU 900

我在用COBOL编写代码时遇到了一个奇怪的问题

我对这些执行语句进行了编码:

        PERFORM 000-INITIAL
           THRU 000-INITIAL-EXIT.

        PERFORM 100-MAIN-PROCESS
           THRU 100-MAIN-PROCESS-EXIT
          UNTIL END-OF-FILE.

        PERFORM 900-END-PGM
           THRU 900-END-PGM-EXIT.
下面是第100-MAIN-PROCESS段中的句子,以及100-MAIN-PROCESS-EXIT后面的下一段:

    100-MAIN-PROCESS.

        MOVE  WS-ACCOUNT-NO         TO  IB-ROUTE-ACCT-NUM.

        CALL IBRTEDBS               USING IB-ROUTE-PARAMETERS.

        MOVE  014                   TO  KEY-DDACCT00-BANK-NO.
        MOVE  'D'                   TO  KEY-DDACCT00-APP-CODE.
        MOVE  WS-ACCOUNT-NO         TO  KEY-DDACCT00-ACCT-NO.

        PERFORM  920-GU-ACCT
           THRU  920-EXIT.

        IF NOT SUCCESSFUL-STATUS
           MOVE 999999              TO SDCR-GENERAL-BRANCH-1
        ELSE
           MOVE DD-ACCT-BRANCH      TO SDCR-GENERAL-BRANCH-1.

        PERFORM 200-WRITE-DATA
           THRU 200-WRITE-DATA-EXIT.

        READ IN-FILE AT END MOVE 'Y' TO SW-EOF.

    100-MAIN-PROCESS-EXIT.
        EXIT.

   *----------------------------------------------------------------*

    200-WRITE-DATA.                               

        INITIALIZE DASDCR-REC.
        MOVE 'L'                    TO  INPUT-LOG-TYPE.
        MOVE 'D'                    TO  INPUT-APP-CODE.
        MOVE 014                    TO  INPUT-BANK-NO.
如果
END-OF-FILE
为true(
SW-EOF='Y'
),则循环应已结束,且流程应继续执行段落
900-END-PGM
。问题是,该过程没有这样做,而是继续
200-WRITE-DATA
。这就好像它在阅读了
EXIT
语句后执行了
下一句话。
有人知道为什么会这样吗?有解决办法吗

更新: 更正了文件中读取的句子
,复制了错误的代码
GO TO 900-END-PGM
只是我使用的临时修复程序,以便程序能够正确运行。 我对这个问题也很确定,因为我已经观察到了如何使用调试工具逐行运行这个程序

下面是完整的代码:

    PROCEDURE  DIVISION.

        PERFORM 000-INITIAL
           THRU 000-INITIAL-EXIT.

        PERFORM 100-MAIN-PROCESS
           THRU 100-MAIN-PROCESS-EXIT
          UNTIL END-OF-FILE.

        PERFORM 900-END-PGM
           THRU 900-END-PGM-EXIT.

   *----------------------------------------------------------------*

    000-INITIAL.

        ENTRY  'DLITCBL'            USING  PCB-IO-TERM
                                           PCB-DDACCAPR
                                           PCB-DDACCJFC
                                           PCB-DDACCCPR
                                           PCB-DDACCDPR
                                           PCB-DDACCEPR
                                           PCB-DDACCFPR
                                           PCB-DDACCGPR
                                           PCB-DDACCHPR
                                           PCB-DDACCIPR
                                           PCB-DDACCJPR
                                           PCB-DDACCKPR
                                           PCB-DDACCLPR
                                           PCB-DDACCMPR
                                           PCB-DDACCNPR.

        OPEN INPUT IN-FILE
        IF NOT FILE-SUCCESSFUL-STATUS
           DISPLAY 'OPEN INPUT FILE QSAM IN-FILE ERROR: '
           WS-FILE-STATUS
           GO TO 000-INITIAL-EXIT.

        OPEN OUTPUT OUT-FILE
        IF NOT FILE-SUCCESSFUL-STATUS
           DISPLAY 'OPEN INPUT FILE QSAM OUT-FILE ERROR: '
           WS-FILE-STATUS
           GO TO 000-INITIAL-EXIT.

        READ IN-FILE AT END MOVE 'Y' TO SW-EOF.

    000-INITIAL-EXIT.
        EXIT.

   *----------------------------------------------------------------*

    100-MAIN-PROCESS.

        MOVE  IN-DDA                TO  IB-ROUTE-ACCT-NUM.

        CALL IBRTEDBS               USING IB-ROUTE-PARAMETERS.

        MOVE  014                   TO  KEY-DDACCT00-BANK-NO.
        MOVE  'D'                   TO  KEY-DDACCT00-APP-CODE.
        MOVE  IN-DDA                TO  KEY-DDACCT00-ACCT-NO.

        PERFORM  920-GU-ACCT
           THRU  920-EXIT.

        IF NOT SUCCESSFUL-STATUS
           MOVE 999999              TO SDCR-GENERAL-BRANCH-1
        ELSE
           MOVE DD-ACCT-BRANCH      TO SDCR-GENERAL-BRANCH-1.

        PERFORM 200-WRITE-DATA
           THRU 200-WRITE-DATA-EXIT.

        READ IN-FILE AT END MOVE 'Y' TO SW-EOF.

    100-MAIN-PROCESS-EXIT.
        EXIT.

   *----------------------------------------------------------------*

    200-WRITE-DATA.

        INITIALIZE DASDCR-REC.
        MOVE 'L'                    TO  INPUT-LOG-TYPE.
        MOVE 'D'                    TO  INPUT-APP-CODE.
        MOVE 014                    TO  INPUT-BANK-NO.
        MOVE IN-DDA                 TO  INPUT-ACCOUNT-NO.
        MOVE 'B998001P'             TO  INPUT-USER-ID.
        MOVE 624                    TO  SDCR-TRANS-CODE.
        MOVE 650                    TO  SDCR-SOURCE.
        MOVE 0                      TO  SDCR-CONTROL.
        MOVE IN-ORG-BAL             TO  SDCR-AMOUNT.
        MOVE 0                      TO  SDCR-SERIAL-NUMBER.
        MOVE IN-BRANCH              TO  SDCR-BRANCH-NO.
        MOVE '8860'                 TO  SDCR-THP-TXN.

        MOVE 'CBG:'                 TO  WS-GNR-TRLR-1A.
        MOVE IN-BRANCH              TO  WS-GNR-TRLR-1B.
        MOVE 'INV-'                 TO  WS-GNR-TRLR-2A
        MOVE SPACES                 TO  WS-GNR-TRLR-2B.
        MOVE 'DUE-'                 TO  WS-GNR-TRLR-3A.
        MOVE ZEROES                 TO  WS-GNR-TRLR-3B.
        MOVE IN-ACCT-NO             TO  WS-GNR-TRLR-4A.
        MOVE IN-NOTE-NO             TO  WS-GNR-TRLR-4B.
        MOVE WS-GNR-TRLR-1          TO  SDCR-GENERAL-TRLR-1.
        MOVE WS-GNR-TRLR-2          TO  SDCR-GENERAL-TRLR-2.
        MOVE WS-GNR-TRLR-3          TO  SDCR-GENERAL-TRLR-3.
        MOVE WS-GNR-TRLR-4          TO  SDCR-GENERAL-TRLR-4.
        MOVE SPACES                 TO  SDCR-GENERAL-TRLR-5.
        MOVE 'ID'                   TO  CTR1-PREFIX.
        MOVE WSS-CTR-ID             TO  SDCR-GENERAL-TRLR-5.
        MOVE '001'                  TO  SDCR-GENERAL-ID.
        MOVE 'Y'                    TO  SDCR-GENERAL-TTL-IND.
        MOVE 'GNR'                  TO  SDCR-GENERAL-FIX.
        MOVE '0785'                 TO  SDCR-GENERAL-NOBOOK.

        WRITE OUT-REC FROM DASDCR-REC.

        IF NOT ACCT-STATUS-OK
           ADD  1 TO  CTR3
           DISPLAY 'WRITE QSAM FILE LNSDCR02 : '
           DISPLAY 'WRITE/' IN-DDA '/ERROR/ ' STATUS-FILE1.

        ADD  1                      TO  CTR2.

    200-WRITE-DATA-EXIT.
        EXIT.

   *----------------------------------------------------------------*

    920-GU-ACCT.

        GO  TO  920-GU-DDACCT00-DDACCAPR
                920-GU-DDACCT00-DDACCJFC
                920-GU-DDACCT00-DDACCCPR
                920-GU-DDACCT00-DDACCDPR
                920-GU-DDACCT00-DDACCEPR
                920-GU-DDACCT00-DDACCFPR
                920-GU-DDACCT00-DDACCGPR
                920-GU-DDACCT00-DDACCHPR
                920-GU-DDACCT00-DDACCIPR
                920-GU-DDACCT00-DDACCJPR
                920-GU-DDACCT00-DDACCKPR
                920-GU-DDACCT00-DDACCLPR
                920-GU-DDACCT00-DDACCMPR
                920-GU-DDACCT00-DDACCNPR
        DEPENDING  ON  IB-ROUTE-PROCESS-CTL.

   *----------------------------------------------------------------*

    920-GU-DDACCT00-DDACCAPR.

        CALL  'CBLTDLI'             USING  GU-FUNC
                                           PCB-DDACCAPR
                                           DDACCT00
                                           SSA-DDACCT00.

        MOVE  STC-DDACCAPR          TO  WS-RETURN-STATUS.


        GO TO 920-GU-DDACCT00-CHECK-STATUS.

   *----------------------------------------------------------------*

    920-GU-DDACCT00-DDACCJFC.

        CALL  'CBLTDLI'             USING  GU-FUNC
                                           PCB-DDACCJFC
                                           DDACCT00
                                           SSA-DDACCT00.

        MOVE  STC-DDACCJFC          TO  WS-RETURN-STATUS.


        GO TO 920-GU-DDACCT00-CHECK-STATUS.

   *----------------------------------------------------------------*

    920-GU-DDACCT00-DDACCCPR.

        CALL  'CBLTDLI'             USING  GU-FUNC
                                           PCB-DDACCCPR
                                           DDACCT00
                                           SSA-DDACCT00.

        MOVE  STC-DDACCCPR          TO  WS-RETURN-STATUS.


        GO TO 920-GU-DDACCT00-CHECK-STATUS.

   *----------------------------------------------------------------*

    920-GU-DDACCT00-DDACCDPR.

        CALL  'CBLTDLI'             USING  GU-FUNC
                                           PCB-DDACCDPR
                                           DDACCT00
                                           SSA-DDACCT00.

        MOVE  STC-DDACCDPR          TO  WS-RETURN-STATUS.


        GO TO 920-GU-DDACCT00-CHECK-STATUS.

   *----------------------------------------------------------------*

    920-GU-DDACCT00-DDACCEPR.

        CALL  'CBLTDLI'             USING  GU-FUNC
                                           PCB-DDACCEPR
                                           DDACCT00
                                           SSA-DDACCT00.

        MOVE  STC-DDACCEPR          TO  WS-RETURN-STATUS.


        GO TO 920-GU-DDACCT00-CHECK-STATUS.

   *----------------------------------------------------------------*

    920-GU-DDACCT00-DDACCFPR.

        CALL  'CBLTDLI'             USING  GU-FUNC
                                           PCB-DDACCFPR
                                           DDACCT00
                                           SSA-DDACCT00.

        MOVE  STC-DDACCFPR          TO  WS-RETURN-STATUS.


        GO TO 920-GU-DDACCT00-CHECK-STATUS.

   *----------------------------------------------------------------*

    920-GU-DDACCT00-DDACCGPR.

        CALL  'CBLTDLI'             USING  GU-FUNC
                                           PCB-DDACCGPR
                                           DDACCT00
                                           SSA-DDACCT00.

        MOVE  STC-DDACCGPR          TO  WS-RETURN-STATUS.


        GO TO 920-GU-DDACCT00-CHECK-STATUS.

   *----------------------------------------------------------------*

    920-GU-DDACCT00-DDACCHPR.

        CALL  'CBLTDLI'             USING  GU-FUNC
                                           PCB-DDACCHPR
                                           DDACCT00
                                           SSA-DDACCT00.

        MOVE  STC-DDACCHPR          TO  WS-RETURN-STATUS.

        GO TO 920-GU-DDACCT00-CHECK-STATUS.

   *----------------------------------------------------------------*

    920-GU-DDACCT00-DDACCIPR.

        CALL  'CBLTDLI'             USING  GU-FUNC
                                           PCB-DDACCIPR
                                           DDACCT00
                                           SSA-DDACCT00.

        MOVE  STC-DDACCIPR          TO  WS-RETURN-STATUS.

        GO TO 920-GU-DDACCT00-CHECK-STATUS.

   *----------------------------------------------------------------*

    920-GU-DDACCT00-DDACCJPR.

        CALL  'CBLTDLI'             USING  GU-FUNC
                                           PCB-DDACCJPR
                                           DDACCT00
                                           SSA-DDACCT00.

        MOVE  STC-DDACCJPR          TO  WS-RETURN-STATUS.

        GO TO 920-GU-DDACCT00-CHECK-STATUS.

   *----------------------------------------------------------------*

    920-GU-DDACCT00-DDACCKPR.

        CALL  'CBLTDLI'             USING  GU-FUNC
                                           PCB-DDACCKPR
                                           DDACCT00
                                           SSA-DDACCT00.

        MOVE  STC-DDACCKPR          TO  WS-RETURN-STATUS.

        GO TO 920-GU-DDACCT00-CHECK-STATUS.

   *----------------------------------------------------------------*

    920-GU-DDACCT00-DDACCLPR.

        CALL  'CBLTDLI'             USING  GU-FUNC
                                           PCB-DDACCLPR
                                           DDACCT00
                                           SSA-DDACCT00.

        MOVE  STC-DDACCLPR          TO  WS-RETURN-STATUS.

        GO TO 920-GU-DDACCT00-CHECK-STATUS.

   *----------------------------------------------------------------*

    920-GU-DDACCT00-DDACCMPR.

        CALL  'CBLTDLI'             USING  GU-FUNC
                                           PCB-DDACCMPR
                                           DDACCT00
                                           SSA-DDACCT00.

        MOVE  STC-DDACCMPR          TO  WS-RETURN-STATUS.

        GO TO 920-GU-DDACCT00-CHECK-STATUS.

   *----------------------------------------------------------------*

    920-GU-DDACCT00-DDACCNPR.

        CALL  'CBLTDLI'             USING  GU-FUNC
                                           PCB-DDACCNPR
                                           DDACCT00
                                           SSA-DDACCT00.

        MOVE  STC-DDACCNPR          TO  WS-RETURN-STATUS.

        GO TO 920-GU-DDACCT00-CHECK-STATUS.

   *----------------------------------------------------------------*

    920-GU-DDACCT00-CHECK-STATUS.

        IF DATA-NOT-FOUND
           DISPLAY IN-DDA '---DDACCT ZERO RECORD NOT FOUND...'
           GO TO 920-EXIT.

        IF  NOT  SUCCESSFUL-STATUS
            PERFORM 999-ABEND
               THRU 999-ABEND-EXIT.

    920-EXIT.
        EXIT.

   *----------------------------------------------------------------*

    999-ABEND.

        MOVE  ABEND-MESS(WS-ABEND-SUB)
                                    TO ABEND-TEXT-MESS.
        DISPLAY  ABEND-TEXT.

        CALL  'IBABNDBS'.

    999-ABEND-EXIT.
        EXIT.

   *----------------------------------------------------------------*

    900-END-PGM.

        DISPLAY  'TOTAL READ                  : '  CTR1.
        DISPLAY  'TOTAL WRITE-SUKSES          : '  CTR2.
        DISPLAY  'TOTAL WRITE-FAILED LNSDCR02 : '  CTR3.

        CLOSE IN-FILE
        IF NOT FILE-SUCCESSFUL-STATUS
           DISPLAY 'CLOSE FILE QSAM IN-FILE ERROR: '
           WS-FILE-STATUS.

        CLOSE OUT-FILE
        IF NOT FILE-SUCCESSFUL-STATUS
           DISPLAY 'CLOSE FILE QSAM OUT-FILE ERROR: '
           WS-FILE-STATUS.

        GOBACK.

    900-END-PGM-EXIT.
        EXIT.

这可能是原因,也可能不是原因(我们不能说没有检查代码的可能性),但您的程序会中断程序流,因为:

    READ IN-FILE AT END MOVE 'Y' TO SW-EOF
                        GO TO 900-END-PGM.

100-MAIN-PROCESS-EXIT.
    EXIT.
如果到达文件末尾,您可以设置
end-OF-file
(至少我可以假设这一点,不需要检查代码,如果您使用
将end-OF-file设置为TRUE
而不是
将“Y”移动到SW-EOF
btw),然后
转到900-end-PGM,这可能会更干净。
。 您永远无法到达段落
100-MAIN-PROCESS-EXIT.
,因此您的主循环仍将处于活动状态

900-END-PGM
看起来像什么?代码放在哪里(是否都“在”您的主
执行到
s


附加说明:
EXIT
语句是一个no-op语句,您可以用
CONTINUE
替换它,以更清楚地了解它的实际功能。“EXIT”只是一种注释,“我们在某处使用
PERFORM-THRU
并在此处结束”.

由@SimonSobisch提供,通过将
条目
语句移出
PERFORM 000-INITIAL
,可以解决此问题,如下所示:


我想看看
PERFORM 900-END-PGM
100-MAIN-PROCESS
之间的代码。如果没有停止运行/goback,程序将从
PERFORM 900-END-PGM
100-MAIN-PROCESS
@BruceMartin我已经用上述代码更新了问题code@AnthonyPangestu-你在debu中验证了吗gger,您没有使用
条目进入程序,而是以
程序部分开始进入程序?@SimonSobisch既然您提到了它,程序执行的程序部分的第一行是
在文件中打开输入
,而不是
执行000-INITIAL
@AnthonyPangestu那么您就有了答案,不是吗你说呢?这不是禁止操作。这是有条件的返回。如果代码在执行语句的控制下,它将返回到执行。@EJP我很确定
退出段落
退出部分
语句退出相应的过程,
退出程序
退出函数
退出方法
,其范围(类似于
GOBACK
)但是,<代码>退出>代码>将不起作用。在<<代码>执行< <代码> >代码>代码>退出/代码>中间的任何地方都不会做任何事,是吗?我只能重复。在执行语句的控制下,退出语句退出执行。请在“EJP”中讨论这一点。这是错误的。EXIT语句仅用于允许用户将过程名称分配给过程划分中的给定点。这样的EXIT语句对编译或执行没有其他影响。
通常使用
条目
,而不是使用
di将参数添加到
过程划分中,这仍然是一个问题直截了当地。。。
   PROCEDURE  DIVISION.

       ENTRY  'DLITCBL'            USING  PCB-IO-TERM
                                          PCB-DDACCAPR
                                          PCB-DDACCJFC
                                          PCB-DDACCCPR
                                          PCB-DDACCDPR
                                          PCB-DDACCEPR
                                          PCB-DDACCFPR
                                          PCB-DDACCGPR
                                          PCB-DDACCHPR
                                          PCB-DDACCIPR
                                          PCB-DDACCJPR
                                          PCB-DDACCKPR
                                          PCB-DDACCLPR
                                          PCB-DDACCMPR
                                          PCB-DDACCNPR.

       PERFORM 000-INITIAL
          THRU 000-INITIAL-EXIT.

       PERFORM 100-MAIN-PROCESS
          THRU 100-MAIN-PROCESS-EXIT
         UNTIL END-OF-FILE.

       PERFORM 900-END-PGM
          THRU 900-END-PGM-EXIT.

  *----------------------------------------------------------------*

   000-INITIAL.

       OPEN INPUT IN-FILE
       IF NOT FILE-SUCCESSFUL-STATUS
          DISPLAY 'OPEN INPUT FILE QSAM IN-FILE ERROR: '
          WS-FILE-STATUS
          GO TO 000-INITIAL-EXIT.

       OPEN OUTPUT OUT-FILE
       IF NOT FILE-SUCCESSFUL-STATUS
          DISPLAY 'OPEN INPUT FILE QSAM OUT-FILE ERROR: '
          WS-FILE-STATUS
          GO TO 000-INITIAL-EXIT.

       READ IN-FILE AT END MOVE 'Y' TO SW-EOF.

   000-INITIAL-EXIT.
       EXIT.