I came across a strange problem when coding in COBOL.
I coded these perform statements:
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.
Then these are the sentences in paragraph 100-MAIN-PROCESS and the next paragraph right after 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.
If END-OF-FILE
is true (SW-EOF = 'Y'
), the loop should have ended and the process should have continued to paragraph 900-END-PGM
. The problem is, instead of doing so, the process continued to 200-WRITE-DATA
. It is as if it performed NEXT SENTENCE
after reading the EXIT
statement.
Anybody know the reason why it's happening like so? Any solution?
UPDATE:
Corrected sentence READ IN-FILE
, copied the wrong code. GO TO 900-END-PGM
was just a temporary fix I used so that the program can run correctly.
I'm also sure about this problem, since I have observed how this run line by line by using debug tool.
And here is the complete code:
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.
Courtesy of @SimonSobisch, this problem is solved by moving ENTRY
statement out of PERFORM 000-INITIAL
, like so:
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.