如何解释 COBOL 缺少 end-if 的行为

问题描述 投票:0回答:1

我试图理解一些 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.
cobol microfocus procobol
1个回答
0
投票

就像评论中提到的,ELSE 语句将与最后一个没有 ELSE 的 IF 语句配对。

我个人讨厌这种类型的代码,因为很难验证其是否正常工作。我讨厌计算 END-IF 和 ELSES。我更喜欢修改此类代码以使用带有多个 WHEN 子句的 EVALUATE TRUE 语句。

© www.soinside.com 2019 - 2024. All rights reserved.