奇怪的错误(COBOL)

时间:2011-02-07 04:50:26

标签: cobol

嘿所有人,这里有一座大问题。我已经完成了一个我必须要做的大学作业计划,但是当我运行它时,输出显示几乎没有任何想象。这只发生在我运行的时候。如果我把F11保持在STEP整个过程中它会显示结果,因为它是假设的。通常情况下我不会问这么大的东西,但我很难过。这是我的代码:

   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.

       SELECT SALESAMT-FILE-IN
           ASSIGN TO 'SALESAMT.SEQ'
           ORGANIZATION IS LINE SEQUENTIAL.

       SELECT SALESMAN-FILE-IN
           ASSIGN TO 'SALESMAN.SEQ'
           ORGANIZATION IS LINE SEQUENTIAL.

       SELECT SALESQTR-FILE-IN
           ASSIGN TO 'SALESQTR.SEQ'
           ORGANIZATION IS LINE SEQUENTIAL.

       SELECT SALESAMT-FILE-OUT
           ASSIGN TO 'SALESAMT.RPT'
           ORGANIZATION IS LINE SEQUENTIAL.

   DATA DIVISION.
   FILE SECTION.

   FD  SALESMAN-FILE-IN.
   01  SALESMAN-RECORD-IN.
       05  SM-NUMBER-IN                    PIC 99.
       05  SM-NAME-IN                      PIC X(20).

   FD  SALESQTR-FILE-IN.
   01  SALESQTR-RECORD-IN.
       05  QUARTER-YEAR                    PIC X.

   FD  SALESAMT-FILE-IN.
   01  SALESAMT-RECORD-IN.
       05  SM-NUMBER                       PIC 99.
       05                                  PIC X.
       05  MONTH-NUMBER                    PIC 9.
       05                                  PIC X.
       05  SALES-AMOUNT                    PIC 9(5).

   FD  SALESAMT-FILE-OUT.
   01  SALESAMT-RECORD-OUT                 PIC X(80).

   WORKING-STORAGE SECTION.
   01  ARE-THERE-MORE-RECORDS              PIC X(3)  VALUE 'YES'.

   01  REPORT-START                        PIC X     VALUE 'Y'.

   01  LINE-COUNT                          PIC 99    VALUE ZEROS.

   01  LINE-JUMP                           PIC X     VALUE 'Y'.

   01  PAGE-NUMBER                         PIC 99    VALUE ZEROS.

   01  QUARTER-CHECK                       PIC X.

   01  ROUTINE-CHECK                       PIC 99    VALUE ZEROS.

   01  SALESMAN-MATH                       PIC 9(5)  VALUE ZEROS.

   01  SALESMAN-TOTAL                      PIC 9(6)  VALUE ZEROS.

   01  FINAL-M-TOTAL-1                     PIC 9(7)  VALUE ZEROS.

   01  FINAL-M-TOTAL-3                     PIC 9(7)  VALUE ZEROS.

   01  FINAL-M-TOTAL-2                     PIC 9(7)  VALUE ZEROS.

   01  FINAL-TOTAL                         PIC 9(7)  VALUE ZEROS.

   01  SM-NUM-M                           PIC 99    VALUE ZEROS.

   01  MORE-TABLE-RECS                     PIC X     VALUE 'Y'.

   01  SPACE-LINE                          PIC X     VALUE SPACE.

   01  MONTH-NAMES
           VALUE 'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'.
       05  MONTH-TITLES OCCURS 12 TIMES    PIC X(3).

   01  MONTH-ARRAY.
       05  THREE-MONTHS OCCURS 3 TIMES.
           10 MONTH-TOTAL OCCURS 99 TIMES  PIC 9(7)  VALUE ZEROS.

   01  SALESMAN-TABLE.
       05  TABLE-ENTRIES OCCURS 99 TIMES
               INDEXED BY IND-TABLE-ENTRIES.
           10 SALESMAN-NUMBER              PIC 99    VALUE ZEROS.
           10 SALESMAN-NAME                PIC X(20) VALUE SPACES.
   01  SALESMAN-COUNT                      PIC 9(3)  VALUE ZEROS.

   01  WS-DATE.
       05  RUN-YEAR                        PIC XX.
       05  RUN-MONTH                       PIC XX.
       05  RUN-DAY                         PIC XX.

   01  HEADING-LINE-1.
       05                                  PIC X(17) VALUE SPACES.
       05                                  PIC X(35)
           VALUE 'SALES AMOUNTS BY SALESMAN AND MONTH'.
       05                                  PIC X(10)  VALUE SPACES.
       05  HL-1-DATE.
           10  MONTH-2                     PIC XX.
           10                              PIC X      VALUE '/'.
           10  DAY-2                       PIC XX.
           10                              PIC X      VALUE '/'.
           10  YEAR-2                      PIC XX.
       05                                  PIC X(3)   VALUE SPACES.
       05  PAGE-1                          PIC X(4)   VALUE 'PAGE'.
       05                                  PIC X(1)   VALUE SPACES.
       05  NUMBER-PAGE                     PIC Z9.

   01  HEADING-LINE-2.
       05  HL-NUM                          PIC X(3)   VALUE 'NUM'.
       05  HL-BLANK-A                      PIC XX     VALUE SPACES.
       05  HL-NAME                         PIC X(4)   VALUE 'NAME'.
       05  HL-BLANK-B                      PIC X(20)  VALUE SPACES.
       05  HL-MONTH-1                      PIC X(3)   VALUE SPACES.
       05  HL-BLANK-C                      PIC X(8)   VALUE SPACES.
       05  HL-MONTH-2                      PIC X(3)   VALUE SPACES.
       05  HL-BLANK-D                      PIC X(8)   VALUE SPACES.
       05  HL-MONTH-3                      PIC X(3)   VALUE SPACES.
       05  HL-BLANK-E                      PIC X(10)  VALUE SPACES.
       05  HL-TOTAL                        PIC X(5)   VALUE 'TOTAL'.

   01  DETAIL-LINE.
       05  DL-BLANK-A                      PIC X      VALUE SPACES.
       05  DL-NUM-COLUMN                   PIC 99.
       05  DL-BLANK-B                      PIC XX     VALUE SPACES.
       05  DL-NAME-COLUMN                  PIC X(17).
       05  DL-BLANK-C                      PIC X(4)   VALUE SPACES.
       05  DL-MONTH-1                      PIC ZZ,Z(3).
       05  DL-BLANK-D                      PIC X(5)   VALUE SPACES.
       05  DL-MONTH-2                      PIC ZZ,Z(3).
       05  DL-BLANK-E                      PIC X(5)   VALUE SPACES.
       05  DL-MONTH-3                      PIC ZZ,Z(3).
       05  DL-BLANK-F                      PIC X(8)   VALUE SPACES.
       05  DL-TOTAL                        PIC Z(3),Z(3).

   01 TOTALS-LINE.
       05  TL-WORDS                        PIC X(12)
           VALUE 'Final Totals'.
       05  TL-BLANK-A                      PIC X(12)   VALUE SPACES.
       05  MONTH-1-TOTAL                   PIC Z,Z(3),Z(3).
       05  TL-BLANK-A                      PIC X(2)   VALUE SPACES.
       05  MONTH-2-TOTAL                   PIC Z,Z(3),Z(3).
       05  TL-BLANK-A                      PIC X(2)   VALUE SPACES.
       05  MONTH-3-TOTAL                   PIC Z,Z(3),Z(3).
       05  TL-BLANK-A                      PIC X(5)   VALUE SPACES.
       05  MONTH-FINAL-TOTAL               PIC Z,Z(3),Z(3).

   PROCEDURE DIVISION.
   100-MAIN.
       OPEN INPUT SALESAMT-FILE-IN, SALESMAN-FILE-IN,
           SALESQTR-FILE-IN
       OPEN OUTPUT SALESAMT-FILE-OUT

       ACCEPT WS-DATE FROM DATE
       MOVE RUN-MONTH TO MONTH-2
       MOVE RUN-DAY TO DAY-2
       MOVE RUN-YEAR TO YEAR-2

       PERFORM 200-NEXT-PAGE

       PERFORM 300-SALES-ARRAY

       PERFORM 400-SALESMAN-NAME

       PERFORM 500-PROCESS-FILE

       PERFORM 600-FINAL-TOTALS

       CLOSE SALESAMT-FILE-IN, SALESMAN-FILE-IN, SALESQTR-FILE-IN
       CLOSE SALESAMT-FILE-OUT
       STOP RUN.

   200-NEXT-PAGE.
       ADD 1 TO PAGE-NUMBER
       MOVE PAGE-NUMBER TO NUMBER-PAGE
       MOVE HEADING-LINE-1 TO SALESAMT-RECORD-OUT
       IF REPORT-START = 'N'
           WRITE SALESAMT-RECORD-OUT
               AFTER ADVANCING PAGE
       ELSE
           MOVE 'N' TO REPORT-START
           WRITE SALESAMT-RECORD-OUT
               AFTER ADVANCING 1 LINE
           PERFORM 210-MONTH-CHECK
       END-IF.
       MOVE HEADING-LINE-2 TO SALESAMT-RECORD-OUT
       WRITE SALESAMT-RECORD-OUT
           AFTER ADVANCING 2 LINES
       MOVE ZEROS TO LINE-COUNT.

   210-MONTH-CHECK.
       READ SALESQTR-FILE-IN
           AT END
               CONTINUE
           NOT AT END
               PERFORM 220-MONTH-NAME
       END-READ.

   220-MONTH-NAME.
           EVALUATE QUARTER-YEAR
               WHEN = 1       MOVE MONTH-TITLES(1) TO HL-MONTH-1
                              MOVE MONTH-TITLES(2) TO HL-MONTH-2
                              MOVE MONTH-TITLES(3) TO HL-MONTH-3

               WHEN = 2       MOVE MONTH-TITLES(4) TO HL-MONTH-1
                              MOVE MONTH-TITLES(5) TO HL-MONTH-2
                              MOVE MONTH-TITLES(6) TO HL-MONTH-3

               WHEN = 3       MOVE MONTH-TITLES(7) TO HL-MONTH-1
                              MOVE MONTH-TITLES(8) TO HL-MONTH-2
                              MOVE MONTH-TITLES(9) TO HL-MONTH-3

               WHEN = 4       MOVE MONTH-TITLES(10) TO HL-MONTH-1
                              MOVE MONTH-TITLES(11) TO HL-MONTH-2
                              MOVE MONTH-TITLES(12) TO HL-MONTH-3
           END-EVALUATE.


   300-SALES-ARRAY.
       PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO '
           READ SALESAMT-FILE-IN
               AT END
                   MOVE 'NO ' TO ARE-THERE-MORE-RECORDS
               NOT AT END
                   PERFORM 310-STORE-DATA
           END-READ
       END-PERFORM.

   310-STORE-DATA.
       MOVE SM-NUMBER TO SM-NUM-M
       EVALUATE MONTH-NUMBER
           WHEN 1                  PERFORM 320-FIRST-MONTH

           WHEN 2                  PERFORM 330-SECOND-MONTH

           WHEN 3                  PERFORM 340-THIRD-MONTH

       END-EVALUATE.

   320-FIRST-MONTH.
       ADD SALES-AMOUNT TO
           MONTH-TOTAL OF MONTH-ARRAY (1, SM-NUM-M).

   330-SECOND-MONTH.
       ADD SALES-AMOUNT TO
           MONTH-TOTAL OF MONTH-ARRAY (2, SM-NUM-M).

   340-THIRD-MONTH.
       ADD SALES-AMOUNT TO
           MONTH-TOTAL OF MONTH-ARRAY (3, SM-NUM-M).

   400-SALESMAN-NAME.
       PERFORM UNTIL MORE-TABLE-RECS = 'N'
           READ SALESMAN-FILE-IN
               AT END
                   MOVE 'N' TO MORE-TABLE-RECS
               NOT AT END
                   PERFORM 450-TABLE-LOAD
           END-READ
       END-PERFORM.

   450-TABLE-LOAD.
       MOVE SM-NUMBER-IN TO SALESMAN-COUNT
       MOVE SM-NUMBER-IN TO SALESMAN-NUMBER (SALESMAN-COUNT)
       MOVE SM-NAME-IN TO SALESMAN-NAME (SALESMAN-COUNT).

   500-PROCESS-FILE.
       PERFORM UNTIL ROUTINE-CHECK = 99
           ADD 1 TO ROUTINE-CHECK
           PERFORM 510-TABLE-SEARCH
       END-PERFORM.

   510-TABLE-SEARCH.
       SEARCH TABLE-ENTRIES
           WHEN SALESMAN-NUMBER (ROUTINE-CHECK) = ROUTINE-CHECK
               PERFORM 520-WRITE-FILE
           WHEN SALESMAN-NUMBER (ROUTINE-CHECK) = 0
               CONTINUE
       END-SEARCH.

   520-WRITE-FILE.
       MOVE SALESMAN-NAME (ROUTINE-CHECK) TO DL-NAME-COLUMN
       IF DL-NAME-COLUMN = SPACES
           MOVE '*** Not Found ***' TO DL-NAME-COLUMN
       END-IF
       MOVE ROUTINE-CHECK TO DL-NUM-COLUMN
       MOVE ROUTINE-CHECK TO SM-NUM-M
       MOVE MONTH-TOTAL (1, SM-NUM-M) TO DL-MONTH-1
       MOVE DL-MONTH-1 TO SALESMAN-MATH
       ADD SALESMAN-MATH TO SALESMAN-TOTAL
       ADD SALESMAN-MATH TO FINAL-M-TOTAL-1
       ADD SALESMAN-MATH TO FINAL-TOTAL
       MOVE MONTH-TOTAL (2, SM-NUM-M) TO DL-MONTH-2
       MOVE DL-MONTH-2 TO SALESMAN-MATH
       ADD SALESMAN-MATH TO SALESMAN-TOTAL
       ADD SALESMAN-MATH TO FINAL-M-TOTAL-2
       ADD SALESMAN-MATH TO FINAL-TOTAL
       MOVE MONTH-TOTAL (3, SM-NUM-M) TO DL-MONTH-3
       MOVE DL-MONTH-3 TO SALESMAN-MATH
       ADD SALESMAN-MATH TO SALESMAN-TOTAL
       ADD SALESMAN-MATH TO FINAL-M-TOTAL-3
       ADD SALESMAN-MATH TO FINAL-TOTAL
       IF SALESMAN-TOTAL > 0
           MOVE SALESMAN-TOTAL TO DL-TOTAL
           MOVE DETAIL-LINE TO SALESAMT-RECORD-OUT
           WRITE SALESAMT-RECORD-OUT
               AFTER ADVANCING 2 LINES
       END-IF
       MOVE ZEROS TO SALESMAN-TOTAL.

   600-FINAL-TOTALS.
       MOVE FINAL-M-TOTAL-1 TO MONTH-1-TOTAL
       MOVE FINAL-M-TOTAL-2 TO MONTH-2-TOTAL
       MOVE FINAL-M-TOTAL-3 TO MONTH-3-TOTAL
       MOVE FINAL-TOTAL TO MONTH-FINAL-TOTAL
       MOVE TOTALS-LINE TO SALESAMT-RECORD-OUT
       WRITE SALESAMT-RECORD-OUT
           AFTER ADVANCING 3 LINES.

对我而言,似乎逻辑是正确的,因为它确实有效,但出于某种原因(当我看到结果时)(当我看到结果时)在它运行时完全超过520-WRITE-FILE。有了这个,我会留下一些笔记。

  1. 我知道510-TABLE-SEARCH没什么意义,我打算稍后更改它,但我需要先修复它,它现在可以正常工作。除非这是主要问题,否则请不要骚扰我。

  2. 如果有人问我,我愿意在SEQ文件中添加数据。

  3. 我的代码可能有点复杂,我承认这一点,但我正在尽我所能与我的老师一起做(我主要是自己学习这些东西)。

    < / LI>

    我感谢任何帮助,感谢任何提前帮助的人。

    编辑:我使用的是名为Micro Focus,Net Express 5.1 Academic Edition的编译器,我的操作系统是Windows Vista。至于程序在我运行它时显示的是什么,它只显示我的两个标题行,然后我的总计行没有任何东西,只有第一个字段显示。我希望有所帮助。

5 个答案:

答案 0 :(得分:4)

我不确定这是否是问题,但我可以看到一个不能很好地运作的逻辑流程......

首先:400-SALESMAN-NAME将文件中的销售员记录读入工作存储表SALESMAN-TABLE

该文件可能类似于:

01Sales Guy One   
02Lance Winslow   
03Scott Peterson   
04Willy Loman   

当读取循环完成时,SALESMAN-NUMBER将等于表索引,因为 加载表的方式(使用SM-NUMBER-IN设置表下标)。到目前为止没问题......

下一步:500-PROCESS-FILE循环遍历SALESMAN-TABLE中的所有行,方法是从1到99运行下标ROUTINE-CHECK并执行510-TABLE-SEARCH为销售人员写出报告下标等于SALESMAN-NUMBER ...

下一篇:SEARCH声明。这是一切都很奇怪,永远不会执行520-WRITE-FILE。 这就是原因。

SEARCH语句实现线性搜索(SEARCH ALL是二分搜索)。 SEARCH只增加与搜索到的表关联的索引,然后运行一堆WHEN测试,直到其中一个&#34;触发&#34;或者索引在表的末尾运行。您TABLE-ENTRIES表的索引为IND-TABLE-ENTRIES。但是你永远不会设置或引用它(这是问题的根源)。我马上解释一下......

请注意,WHEN的{​​{1}}部分正在使用下标SEARCHROUTINE-CHECK中设置了ROUTINE-CHECK。另请注意,如果500-PROCESS-FILE520-WRITE-FILE的值匹配,您只能访问SALESMAN-NUMBER - 如果从输入文件中读取了具有该编号的推销员,它将会执行此操作。这可能有效,因为您加载了表格,使得行号等于ROUTINE-CHECK中的推销员编号。

现在,如果输入文件不包含450-TABLE-LOAD等于01的推销员,会发生什么?

让我们通过它,吹一击...

SM-NUMBER-IN设置为1,调用ROUTINE-CHECK并且因为与搜索表关联的SEARCH索引小于表中发生的数(它被初始化为零)在程序加载时,执行IND-TABLE-ENTRIES子句。

第一个测试是WHEN。由于Salesman 1不存在,WHEN SALESMAN-NUMBER (ROUTINE-CHECK) = ROUTINE-CHECK将为零并且测试失败(0&lt;&gt; 1)。

尝试了下一个SALESMAN-NUMBER子句,它成功了,因为(0 = 0);但这是一个什么都不做的事情。选项,因此在WHEN递增后输入另一个SEARCH循环

通过IND-TABLE-ENTRIES ed WHEN列表中的此次和所有后续迭代的相同结果(没有子句匹配)...重复此循环,直到SEARCH递增超出表的末尾。

此时IND-TABLE-ENTRIES终止并控制流回SEARCH中的下一个循环。什么都没有打印出来。

500-PROCESS-FILE然后将500-PROCESS-FILE增加1(现在为2)。我们有一个ROUTINE-CHECK为02的推销员,所以我们应该得到一些输出 - 对吧?错误!但为什么呢?

如果您阅读SALESMAN-NUMBER动词,您会发现它不会重置表索引(在本例中为SEARCH)。它开始使用输入SEARCH时的任何值。你永远不会重置它,所以它已经设置超出表的末尾。搜索只是终止,没有任何东西被打印 - 再次。

解决问题

鉴于您首先按销售员编号加载了IND-TABLE-ENTRIES,我看不到使用搜索的目的。做一些像:

TABLE-ENTRIES

也可以为表创建一个初始化循环,以便在读取salesman文件之前将每个SALESMAN-NUMBER显式设置为零。

如果你必须在这个程序中使用SEARCH,那么在引用被搜索的表时,不要忘记设置和使用相关的表索引变量。

答案 1 :(得分:1)

我已将此添加为第二个答案,我认为这是正确的!

520-WRITE-FILE没有被执行,因为调用它的SEARCH失败了。

在510-TABLE-SEARCH中,我认为你需要搜索为表声明的索引, IND-表条目。您可能需要重新编码500-PROCESS-FILE和510-TABLE-SEARCH。

在另一个问题中,您询问了SEARCH动词。 fmartin通过示例给出了一个描述其工作原理的链接。

答案 2 :(得分:0)

PLS。改为:

   SELECT SALESAMT-FILE-OUT
       ASSIGN TO 'SALESAMT.RPT'
       ORGANIZATION IS LINE SEQUENTIAL
       File Status is FILESTATUS.

并添加:

01 FILESTATUS。

 02 FILESTATUS-1                   Pic 9.
   88 SUCCESSFULL                  Value 0.
   88 END-OF-FILE                  Value 1.
   88 INVALID-KEY                  Value 2.
   88 PERMANENT-ERROR              Value 3, 9.
 02 FILESTATUS-2                   Pic 9.
   88 DUPLICATE-KEY                Value 2.
   88 NO-RECORD-FOUND              Value 3.
   88 FILE-IS-FULL                 Value 4.

每次使用SALESAMT-FILE-OUT执行某些操作时,请检查FILESTATUS。 (你也可以使用其他文件)。 借助此修改,您可以查看执行IO时是否有任何错误。

这是第一步,所以这不是最后的问题..

答案 3 :(得分:0)

“它只显示我的两个标题行,然后是我的总计行”

在段落520-WRITE-FILE中,您有以下代码

IF SALESMAN-TOTAL > 0
           MOVE SALESMAN-TOTAL TO DL-TOTAL
           MOVE DETAIL-LINE TO SALESAMT-RECORD-OUT
           WRITE SALESAMT-RECORD-OUT
               AFTER ADVANCING 2 LINES
       END-IF

如果SALESMAN-TOTAL为零,则程序不会打印明细行。 看起来您在SALESMAN-TOTAL总计中有数据或逻辑错误。

答案 4 :(得分:0)

我认为你有一个相当简单的问题,这与你当前的工作目录有关。

在环境分区中,声明文件句柄并将它们分配给文件名。

调试程序时,输入文件位于当前工作目录中,因此可以正确解析。

当你运行程序时,我猜你是从另一个目录运行它,所以输入文件没有解析,因此输出文件只包含一个标题行。