我有这个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.
答案 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
这会为您提供输出2
和5
。
我使用过的名字是你和你的名字的混合物,仅供演示之用。让一切变得有意义,并且我并不是说陈词滥调,因为我的榜样将在现实生活中。
如果你坚持要从你的PERFORM中逃脱(并记下Bruce Martin的评论),你可以通过使用新的,恰当命名的字段来计算你的逃逸值,并给它们的值。以上加一。
当外部循环只有两个条目时,执行嵌套循环是过度的。如果你在循环中有终止条件,你不需要像你一样逃离循环。
直到我们看到您的定义,数据和结果时,我们才会这样做。