我确信有一种更简单的方法可以做到这一点,但我是COBOL的新手.这段代码的某些部分会导致无限循环,在它向写入文件写入任何内容的部分之前,但我看不到位置; 我已经尝试重写它的多个部分,看起来它们可能是问题所在.我错过了什么?
具体问题是它会导致无限循环,即当我运行程序时,它会运行直到硬关闭并且什么也不做.所需的行为是程序访问Ch10_payroll.DAT文件,读取有关九个地区中每个地区的人员年薪的信息,并将每个地区的年度总工资写入Ch10_payroll.RPT文件.
... Working-Storage Section. ... 01 WS-Total-1 PIC 9(6) Value Zeroes. 01 WS-Total-2 PIC 9(6) Value Zeroes. 01 WS-Total-3 PIC 9(6) Value Zeroes. 01 WS-Total-4 PIC 9(6) Value Zeroes. 01 WS-Total-5 PIC 9(6) Value Zeroes. 01 WS-Total-6 PIC 9(6) Value Zeroes. 01 WS-Total-7 PIC 9(6) Value Zeroes. 01 WS-Total-8 PIC 9(6) Value Zeroes. 01 WS-Total-9 PIC 9(6) Value Zeroes. 01 WS-Territory-No PIC 99 Value Zeroes. ... 01 Detail-Line. 05 PIC X(3) Value Spaces. 05 Territory-No-Out PIC 99. 05 PIC X(17) Value Spaces. 05 Current-Territory-Total PIC $ZZZ,ZZZ.99. ... * This section will list the inflation rate and item cost for each projected year. Procedure Division. ... 700-HDR-Module. Perform Until Territory-No-Out Equals 10 If Territory-No-Out Equals 01 Then Move WS-Total-1 To Current-Territory-Total If Territory-No-Out Equals 02 Then Move WS-Total-2 To Current-Territory-Total If Territory-No-Out Equals 03 Then Move WS-Total-3 To Current-Territory-Total If Territory-No-Out Equals 04 Then Move WS-Total-4 To Current-Territory-Total If Territory-No-Out Equals 05 Then Move WS-Total-5 To Current-Territory-Total If Territory-No-Out Equals 06 Then Move WS-Total-6 To Current-Territory-Total If Territory-No-Out Equals 07 Then Move WS-Total-7 To Current-Territory-Total If Territory-No-Out Equals 08 Then Move WS-Total-8 To Current-Territory-Total If Territory-No-Out Equals 09 Then Move WS-Total-9 To Current-Territory-Total Write Print-Rec From HDR-1 Write Print-Rec From Column-Headings After Advancing 2 Lines Write Print-Rec From Detail-Line After Advancing 2 Lines At End-Of-Page Add 1 To Page-Text Add 1 To Territory-No-Out End-Perform Move 'NO ' To Are-There-More-Records. ...
Bill Woodger.. 5
你有这个:
If Territory-No-Out Equals 01 Then Move WS-Total-1 To Current-Territory-Total If Territory-No-Out Equals 02 Then Move WS-Total-2 To Current-Territory-Total ...
A IF
由一个句号/句号终止或由一个句号终止END-IF
.如果在此之前遇到另一个IF(或任何条件语句),则它是"嵌套"的,它的执行是以前一个条件为真为条件的.
您的嵌套IF正在为多个不同的值测试相同的字段,并且您没有END-IF或句点/句点.因此,您认为与IF无关的代码实际上永远不会永远执行.
你也有这个:
Write Print-Rec From Detail-Line After Advancing 2 Lines At End-Of-Page Add 1 To Page-Text
这AT END-OF-PAGE
是一个必要的声明.同样,这由范围终止符(在这种情况下END-WRITE
)或句点/句点终止.所以,一旦你解决了IF问题,你也有这个问题.
使用其范围终止符终止所有条件.使用其范围终止符终止所有命令式语句.使用句号/期限终止段落,部分和程序.
当你在程序中有一个大脂肪循环(BFL)时,通常很容易找到循环的位置.然后,您需要确切了解循环未终止的原因.
如果你有一个BFL并且运行时没有告诉你在哪里,或者你无法找出失败信息或创建的输出的位置,那么你可以查看程序中你有一个循环结构的所有位置.
你找GO TO.你寻找"堕落".您寻找PERFORM ... UNTIL ...
并寻找可能的递归PERFORM.
你只有两个以上.第一个涉及到READ
.如果删除(注释掉)与文件相关的任何其他处理,您可以向自己演示读循环是否正常工作.这意味着它是另一个.
然后,您查看该代码,以了解永远不会达到终止条件.在这种情况下,您会得到"无法执行ADD 1".您是否随后了解范围终止取决于您已经知道的内容.因此,如果您不知道,请查看您的教学笔记和语言手册.
如果您需要在同一场上测试条件的大量IF,请查看使用EVALUATE
(with END-EVALUATE
).
但是,对于您的任务,请查看使用表格OCCURS
.这将节省您命名单个总计,并且无论如何都要求那些IF的字符串.
在这里查看一些其他COBOL问题.了解FILE STATUS
和这样的事情.
你有这个:
If Territory-No-Out Equals 01 Then Move WS-Total-1 To Current-Territory-Total If Territory-No-Out Equals 02 Then Move WS-Total-2 To Current-Territory-Total ...
A IF
由一个句号/句号终止或由一个句号终止END-IF
.如果在此之前遇到另一个IF(或任何条件语句),则它是"嵌套"的,它的执行是以前一个条件为真为条件的.
您的嵌套IF正在为多个不同的值测试相同的字段,并且您没有END-IF或句点/句点.因此,您认为与IF无关的代码实际上永远不会永远执行.
你也有这个:
Write Print-Rec From Detail-Line After Advancing 2 Lines At End-Of-Page Add 1 To Page-Text
这AT END-OF-PAGE
是一个必要的声明.同样,这由范围终止符(在这种情况下END-WRITE
)或句点/句点终止.所以,一旦你解决了IF问题,你也有这个问题.
使用其范围终止符终止所有条件.使用其范围终止符终止所有命令式语句.使用句号/期限终止段落,部分和程序.
当你在程序中有一个大脂肪循环(BFL)时,通常很容易找到循环的位置.然后,您需要确切了解循环未终止的原因.
如果你有一个BFL并且运行时没有告诉你在哪里,或者你无法找出失败信息或创建的输出的位置,那么你可以查看程序中你有一个循环结构的所有位置.
你找GO TO.你寻找"堕落".您寻找PERFORM ... UNTIL ...
并寻找可能的递归PERFORM.
你只有两个以上.第一个涉及到READ
.如果删除(注释掉)与文件相关的任何其他处理,您可以向自己演示读循环是否正常工作.这意味着它是另一个.
然后,您查看该代码,以了解永远不会达到终止条件.在这种情况下,您会得到"无法执行ADD 1".您是否随后了解范围终止取决于您已经知道的内容.因此,如果您不知道,请查看您的教学笔记和语言手册.
如果您需要在同一场上测试条件的大量IF,请查看使用EVALUATE
(with END-EVALUATE
).
但是,对于您的任务,请查看使用表格OCCURS
.这将节省您命名单个总计,并且无论如何都要求那些IF的字符串.
在这里查看一些其他COBOL问题.了解FILE STATUS
和这样的事情.