Loops COBOL-EXIT语句异常行为
我在用COBOL编写代码时遇到了一个奇怪的问题 我对这些执行语句进行了编码: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
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.