If statement If语句中的COBOL编译错误:范围分隔符没有匹配的谓词,已被丢弃

If statement If语句中的COBOL编译错误:范围分隔符没有匹配的谓词,已被丢弃,if-statement,cobol,If Statement,Cobol,我有下面的代码,其中我有3个if语句,我用END if关闭了所有语句,但仍然显示下面的错误 ERROr Message: 17032 END-IF * 564-S****** ( 0)** ** A scope-delimiter did not have a matching verb and was discarded. 17074 END-IF * 56

我有下面的代码,其中我有3个if语句,我用END if关闭了所有语句,但仍然显示下面的错误

ERROr Message: 
17032 END-IF
* 564-S******                                                          (   0)**
**    A scope-delimiter did not have a matching verb and was discarded.
 17074      END-IF
* 564-S***********                                                     ( 294)**
**    A scope-delimiter did not have a matching verb and was discarded.
 17075      END-IF.
* 564-S***********                                                     ( 295)**
**    A scope-delimiter did not have a matching verb and was discarded.




 I-00.

  D    DISPLAY 'IN I-MTS-ACCOUNT-CHK'

   IF NO-INDICATOR      IN PR03-ALLOW-CLOSE-BAN-IND
   THEN

   EXIT SECTION.

   END-IF

        IF  MTS  IN MIGRATION-IND
                 IN PR02-BAN-INFO
        THEN

        IF MTS-MAPPING-ID IN PR02-BAN-INFO = ZERO
        THEN

        CALL "dcs_gt_subs_count"  USING DL-CONTEXT
                                              IN AR01-CONTEXT
                                        BAN   IN PR02-BAN-INFO
                                        AR11-SUB-STATUS-RAS-LIST
                                        AR12-SUB-TOT-COUNT
                                GIVING  AR04-STATUS.

           IF NOT SUCCESS           IN AR04-STATUS
              AND
              NOT DL-KEY-NOTFOUND-S IN AR04-STATUS
           THEN

           SET CTB-MSG-ROUTINE-ERROR     TO TRUE

           MOVE "I-MTS-ACCOUNT-CHK"      TO CTB-SECTION-NAME

           MOVE "DCS_GT_SUBS_COUNT"      TO CTB-ROUTINE-NAME

           MOVE AR04-STATUS              TO CTB-ROUTINE-STATUS

           PERFORM X-HANDLE-ERROR

           PERFORM Z-FINISH
           END-IF

           IF AR12-SUB-TOT-COUNT <> 0
             THEN

              SET NO-INDICATOR  IN PR03-ALLOW-CLOSE-BAN-IND
              TO TRUE
              SET NOT-ALL-SUB-CANCEL IN PR04-EXCEPTION-REASON
              TO TRUE
           END-IF
        END-IF
        END-IF.
    I-EXIT.
     EXIT.
错误消息:
17032结束-如果
*564-S******(0)**
**作用域分隔符没有匹配的谓词,已被丢弃。
17074结束-如果
*564-S**********(294)**
**作用域分隔符没有匹配的谓词,已被丢弃。
17075结束-如果。
*564-S**********(295)**
**作用域分隔符没有匹配的谓词,已被丢弃。
I-00。
D显示“在I-MTS-ACCOUNT-CHK中”
如果PR03-ALLOW-CLOSE-BAN-IND中没有指示灯
然后
出口部分。
端到端IF
迁移-IND中的IF-MTS
在PR02-BAN-INFO中
然后
如果PR02-BAN-INFO中的MTS-MAPPING-ID=零
然后
使用DL-CONTEXT调用“dcs\u gt\u subs\u count”
在AR01-CONTEXT中
PR02-BAN-INFO中的BAN
AR11-SUB-STATUS-RAS-LIST
AR12-SUB-TOT-COUNT
给出AR04-1状态。
如果在AR04状态下未成功
及
非DL-KEY-NOTFOUND-S处于AR04-STATUS状态
然后
将CTB-MSG-ROUTINE-ERROR设置为TRUE
将“I-MTS-ACCOUNT-CHK”移至CTB-SECTION-NAME
将“DCS\U GT\U SUB\U计数”移动到CTB-ROUTION-NAME
将AR04-STATUS移至CTB-RUNTION-STATUS
执行X-HANDLE-ERROR
执行Z-FINISH
端到端IF
如果AR12-SUB-TOT-COUNT为0
然后
在PR03-ALLOW-CLOSE-BAN-IND中设置NO指示灯
真实
在PR04-EXCEPTION-REASON中设置NOT-ALL-SUB-CANCEL
真实
端到端IF
端到端IF
结束-如果。
I-出口。
出口

一个明显的错误是行

        GIVING  AR04-STATUS.
结束上一个if

Cobol风格的建议
  • 为每个段落/部分编写一个,并在I-EXIT之前将单独放在一行上。在大型机上,您可以执行x all;x p'@$'所有(我认为这是一个很长的时间)将在这行末尾找到

           END-IF
        END-IF
        .
    
     I-EXIT.
    
  • 您不需要
    然后
    -删除

  • 正确缩进代码

    IF  NOT SUCCESS           IN AR04-STATUS
    AND NOT DL-KEY-NOTFOUND-S IN AR04-STATUS
        SET CTB-MSG-ROUTINE-ERROR     TO TRUE
    
        MOVE "I-MTS-ACCOUNT-CHK"      TO CTB-SECTION-NAME
    
        MOVE "DCS_GT_SUBS_COUNT"      TO CTB-ROUTINE-NAME
    
        MOVE AR04-STATUS              TO CTB-ROUTINE-STATUS
    
        PERFORM X-HANDLE-ERROR
    
        PERFORM Z-FINISH
    END-IF
    

  • 使您的
    IF
    语句更易于阅读。然后计算你的
    END-IF
    语句。我建议您对代码进行更常规的格式化,这有助于发现这些类型的错误。
    结束上一个ifI。我更喜欢结束行“continue.”,而不仅仅是一个句点。我认为这更清楚。