嘿所有人,这里有一座大问题。我已经完成了一个我必须要做的大学作业计划,但是当我运行它时,输出显示几乎没有任何想象。这只发生在我运行的时候。如果我把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。有了这个,我会留下一些笔记。
我知道510-TABLE-SEARCH没什么意义,我打算稍后更改它,但我需要先修复它,它现在可以正常工作。除非这是主要问题,否则请不要骚扰我。
如果有人问我,我愿意在SEQ文件中添加数据。
我的代码可能有点复杂,我承认这一点,但我正在尽我所能与我的老师一起做(我主要是自己学习这些东西)。
< / LI> 醇>我感谢任何帮助,感谢任何提前帮助的人。
编辑:我使用的是名为Micro Focus,Net Express 5.1 Academic Edition的编译器,我的操作系统是Windows Vista。至于程序在我运行它时显示的是什么,它只显示我的两个标题行,然后我的总计行没有任何东西,只有第一个字段显示。我希望有所帮助。
答案 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}}部分正在使用下标SEARCH
。 ROUTINE-CHECK
中设置了ROUTINE-CHECK
。另请注意,如果500-PROCESS-FILE
与520-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)
我认为你有一个相当简单的问题,这与你当前的工作目录有关。
在环境分区中,声明文件句柄并将它们分配给文件名。
调试程序时,输入文件位于当前工作目录中,因此可以正确解析。
当你运行程序时,我猜你是从另一个目录运行它,所以输入文件没有解析,因此输出文件只包含一个标题行。