我试图理解一些 COBOL 代码的行为,这些代码似乎在嵌套 if 语句中缺少 end-if 语句。如果可以的话,有人可以解释一下吗?我在我认为应该缺少 end-if 语句的地方做了标记。但是,我不想在不了解代码如何通过 if 语句嵌套的情况下更改此代码。
040-EACH-RENDITION.
READ TC298-PAYFILE AT END
MOVE 'Y' TO END-INPUT
.
IF END_INPUT = 'Y' THEN
CONTINUE
ELSE
MOVE SPACES TO HOLD-CO-CODE;
MOVE PF-ACCOUNT TO HOLD-PF-ACCOUNT;
EXEC SQL
SELECT COUNTY-CODE
INTO HOLD-CO-CODE
FROM TAXDTL
WHERE CLIENT-ID = :ACT-CLIENT-ID
AND CAN = :HOLD-PF-ACCOUNT
AND YEAR = :CLIENT-CURRENT-YEAR
END-EXEC
IF HOLD-CO-CODE = SPACES
MOVE 'XXX' TO HOLD-CO-CODE
END-IF;
DISPLAY 'AFTER SELECT HOLD-CO-CODE=' HOLD-CO-CODE ';'
PF-ACCOUNT
MOVE RENDITION-BEGIN-DATE TO RENDITION-FIX-DATE
IF PF-LEVY = 0
CONTINUE
ELSE
IF PF-YEAR < RENDITION-BEGIN-YEAR
IF (ACT-CLIENT-ID = 81000000
AND PF-YEAR = 2005
AND PF-DEPOSIT-DATE < '20080309')
CONTINUE
ELSE
IF (ACT-CLIENT-ID = 81000000
AND PF-YEAR = 2006
AND PF-DEPOSIT-DATE < '20080301')
CONTINUE
ELSE
IF PF-DEPOSIT-DATE < RENDITION-BEGIN-DATE
CONTINUE
ELSE
MOVE PF-ACCOUNT TO RP-CAN
MOVE PF-YEAR TO RP-YEAR
MOVE PF-JURISDICTION TO RP-TAXUNIT
MOVE PF-RECTYPE TO RP-RECTYPE
MOVE PF-OWNERNO TO RP-OWNERNO
MOVE PF-RECEIPT TO RP-RECEIPT
MOVE PF-VALNUM TO RP-VALNUM
MOVE PF-REMIT-SEQ TO RP-REMIT-SEQ
MOVE PF-DEPOSIT TO RP-DEPOSIT
PERFORM 042-GET-PENALTY
IF RENDITION-SW = 'Y'
MOVE PF-RECORD TO WF-RECORD
MOVE RENPEN-AMOUNT TO WF-RENPEN
MOVE HOLD-CO-CODE TO WF-COCODE
WRITE WF-RECORD
END-IF
* seems a few missing end-if statements should go here
ELSE
MOVE PF-ACCOUNT TO RP-CAN
MOVE PF-YEAR TO RP-YEAR
MOVE PF-JURISDICTION TO RP-TAXUNIT
MOVE PF-RECTYPE TO RP-RECTYPE
MOVE PF-OWNERNO TO RP-OWNERNO
MOVE PF-RECEIPT TO RP-RECEIPT
MOVE PF-VALNUM TO RP-VALNUM
MOVE PF-REMIT-SEQ TO RP-REMIT-SEQ
MOVE PF-DEPOSIT TO RP-DEPOSIT
PERFORM 042-GET-PENALTY
IF RENDITION-SW = 'Y'
MOVE PF-RECORD TO WF-RECORD
MOVE RENPEN-AMOUNT TO WF-RENPEN
MOVE HOLD-CO-CODE TO WF-COCODE
WRITE WF-RECORD
.
042-GET-PENALTY.
就像评论中提到的,ELSE 语句将与最后一个没有 ELSE 的 IF 语句配对。
我个人讨厌这种类型的代码,因为很难验证其是否正常工作。我讨厌计算 END-IF 和 ELSES。我更喜欢修改此类代码以使用带有多个 WHEN 子句的 EVALUATE TRUE 语句。