为什么我的if语句没有在两个嵌套执行中确定正确的输出?

时间:2014-03-11 01:23:27

标签: cobol

我有这个Cobol段落,它将搜索一个表,在我的例子中,此表中的表计数器为2,这是第一个INDEX循环的作用。变量A表示在具有5次出现的文件(包括)中定义的发生。我可以到if语句,但它返回false。我从ParmCard中读取信息并将其存储在Table-B表中,ParmCard是正确的。

我确实在改变值(条件语句)时找到了一个值,但是我知道它在ParmCard中寻找的两个值都在文件中并且应该找到并且它应该找到两个结果。我本来试过Expeditor,但系统已经停止工作了。

索引是否有问题,或者我认为表演是以一种方式运作但是他们真的以不同的方式运作?每次读取ID文件时都会执行此搜索段落,因此它会在表格中查找ID文件具有ID且ID符号唯一的次数。

问题:为什么IF-STATEMENT无法正常工作?

代码:

  SEARCH-PARAGRAPH.
      PERFORM VARYING SUB FROM 1 BY 1 UNTIL SUB > 2 <--DUPLICATE INDEXER 
        IF A(TAB) = TABLE-B(SUB) THEN
            MOVE 6 TO TAB
            MOVE 'TRUE' TO FOUND-IS
            PERFORM WRITE-FILE THRU X-WF
            PERFORM LOG-RESULT THRU X-LR
         END-IF
     END-PERFORM

  X-SP. EXIT.


  SEARCH-INDEX.
   PERFORM VARYING I FROM 1 BY 1 UNTIL I > 2
    DISPLAY 'INDEX --> ' I
     PERFORM VARYING TAB FROM 1 BY 1 UNTIL TAB > 5
      DISPLAY 'TAB  --> ' TAB   
         PERFORM SEARCH-PARAGRPAH THRU X-SP
     END-PERFORM
   END-PERFORM.
  X-SEARCH-INDEX. EXIT.

以下是它现在的工作方式,我确实得到了我想要的结果。很难通过公司代码,因为你永远不知道谁可能有问题。

新守则:

   READ-PROV.                                            
     READ P-FILE                                    
        AT END                                         
          MOVE 'Y' TO EOF2                             
          GO TO X-READ-PROV                            
        NOT AT END                                     
          ADD 1 TO T-REC-READ                          
          MOVE P-RECORD TO TEST-RECORD    
          PERFORM CHECK-MATCH THRU X-CHECK-MATCH       
     END-READ.                                         
 X-READ-PROV. EXIT.                                    

CHECK-MATCH.                                                        
    PERFORM VARYING SUB FROM 1 BY 1 UNTIL SUB > TABLECOUNTER        
      IF PID >= FROM(SUB) AND                      
         PID <= THRU(SUB) THEN                     
         IF TODAY < P-END-DTE THEN                        
            IF TOTAL-PD  = 0 AND                              
               TOTAL-PD  = 0 AND                              
               TOTAL-PD = 0 AND                              
               TOTAL-PD = 0 AND                              
               TOTAL-PD = 0 THEN                             
               IF PBILLIND NOT EQUAL 'Y'                      
                PERFORM VARYING TAB FROM 1 BY 1 UNTIL TAB > 5       
                 IF P-CD(TAB) = TY(SUB) THEN    
                    MOVE 6 TO TAB                                   
                      DISPLAY('***Found***')      
                    ADD 1 TO T-REC-FOUND                            
                 END-IF                 
                END-PERFORM             
               END-IF                   
            END-IF                      
         END-IF                         
      END-IF                            
    END-PERFORM.                        
X-CM. EXIT. 

1 个答案:

答案 0 :(得分:0)

我们无法说出来。

没有什么&#34;错误&#34;使用嵌套的PERFORM。 IF测试失败只是因为它永远不会成真。

如果没有看到您的数据定义,样本输入和预期输出,我们无法让您更进一步。

然而......我的猜测是,问题在于JCL中PARM的数据。这是最有可能的领域。

问题当然可能与另一个定义有关。

等待时的几件事。

请始终发布实际代码。我们不想在您输入的内容中查找错误,我们希望查看实际代码。您没有显示实际代码,因为它不会编译,因为INDEX是COBOL中的保留字,因此您无法将其用作数据名称。

请始终牢记您认为错误可能不是问题,所以发布我们可能需要的所有内容(数据定义,您使用的数据,您使用代码获得的实际结果(包括您的任何内容) 39;已添加用于问题确定),结果是预期的。

一些提示。

段落要求在段落名称之后和下一段落之前设置一个句号。如果你把第二个句号/句号放在自己的一行上,并且你的PROCEDURE代码本身没有完整的句点/句号,那么当你想复制一些时,你会让事情看起来更整洁并避免出现问题。碰巧有一个完整的停止/周期到一个让你弄得一团糟的地方。

您正在使用文字值。这是不好的。当其中一个表中的条目数发生更改时,您必须更改这些文字值。假设2需要更改为5。您必须查看文字2的每个匹配项,并确定是否需要更改它。然后将其更改为5。然后你得到另一个请求,更改最初有五个条目的表,以便它有六个。看看生活有多困难/容易出错?

如果您拥有最大条目数量的唯一且命名良好的数据名称,那么您只有一个地方可以进行更改,并且您知道可以在不参考其余代码的情况下更改它(假设某人聪明并没有看到它有一个他们想要的东西的价值,并使用它尽管它的名字,当然......)。

您可以自动设置的字段的内容:

   01  TABLE-1. 
       05  FILLER OCCURS 2 TIMES. 
           10  A PIC X(10). 
   01  TABLE-2. 
       05  FILLER OCCURS 5 TIMES. 
           10  TABLE-B PIC X(10). 
   01  TABLE-1-NO-OF-ENTRIES        COMP   PIC 9(4). 
   01  TABLE-2-NO-OF-ENTRIES        COMP   PIC 9(4). 
   ...
   PROCEDURE DIVISION.
   ... 
       COMPUTE TABLE-1-NO-OF-ENTRIES = LENGTH OF TABLE-1
                                     / LENGTH OF A 
       COMPUTE TABLE-2-NO-OF-ENTRIES = LENGTH OF TABLE-2
                                     / LENGTH OF TABLE-B
       DISPLAY TABLE-1-NO-OF-ENTRIES 
       DISPLAY TABLE-2-NO-OF-ENTRIES 

这会为您提供输出25

我使用过的名字是你和你的名字的混合物,仅供演示之用。让一切变得有意义,并且我并不是说陈词滥调,因为我的榜样将在现实生活中。

如果你坚持要从你的PERFORM中逃脱(并记下Bruce Martin的评论),你可以通过使用新的,恰当命名的字段来计算你的逃逸值,并给它们的值。以上加一。

当外部循环只有两个条目时,执行嵌套循环是过度的。如果你在循环中有终止条件,你不需要像你一样逃离循环。

直到我们看到您的定义,数据和结果时,我们才会这样做。