我正在尝试按项目名对一组项目进行排序, 这是SELECT语句:
SELECT ITEMREC ASSIGN TO 'GROCERY.DAT'.
SELECT SORT-ITEMREC ASSIGN TO SYSWORK.
SELECT OUT-ITEMREC ASSIGN TO 'SORTED_GROCERY.DAT'.
这是文件部分的代码块:
FD ITEMREC.
01 item.
02 itemnum PIC X(10).
02 itemname PIC X(20).
02 itemmanufacturer PIC X(20).
02 itemquantity PIC 99 VALUE ZEROS.
02 itemprice PIC 99 VALUE ZEROS.
SD SORT-ITEMREC.
01 sort-item.
02 itemname2 PIC X(20).
02 filler PIC X(34).
FD OUT-ITEMREC.
01 out-item.
02 itemname3 PIC X(20).
02 filler PIC X(34).
这是PROCEDURE DIVISION的排序声明:
SORT SORT-ITEMREC
ON ASCENDING KEY itemname
USING ITEMREC
GIVING OUT-ITEMREC.
这是打印“SORTED_GROCERY.DAT”:
DISPLAY "".
PERFORM Table-header.
OPEN INPUT OUT-ITEMREC.
PERFORM UNTIL EOF=1
READ OUT-ITEMREC
AT END MOVE 1 TO EOF
NOT AT END PERFORM PRINT-DATA
END-PERFORM.
CLOSE OUT-ITEMREC.
PERFORM Table-footer.
STOP RUN.
“SORTED_GROCERY.DAT”的内容属于排序值,但在打印时,它仅打印DAT文件的第一个条目并替换所有其他值。但是当我通过在上面的代码块中将“OUT-ITEMREC”替换为“ITEMREC”来打印“GROCERY.DAT”时,它打印正常。
我的代码出了什么问题?谢谢!
更新
Table-header.
DISPLAY "Items bought by " WITH NO ADVANCING.
IF csex = "M" THEN
DISPLAY "Mr. " WITH NO ADVANCING
END-IF
IF csex = "F" AND cstatus = "S" THEN
DISPLAY "Ms. " WITH NO ADVANCING
END-IF
IF csex = "F" AND cstatus = "M" THEN
DISPLAY "Mrs. " WITH NO ADVANCING
END-IF
DISPLAY cname WITH NO ADVANCING.
DISPLAY ":".
DISPLAY "".
DISPLAY "====================" WITH NO ADVANCING.
DISPLAY "====================" WITH NO ADVANCING.
DISPLAY "====================" WITH NO ADVANCING.
DISPLAY "====================" WITH NO ADVANCING.
DISPLAY "".
DISPLAY "[Number of Pieces] " WITH NO ADVANCING.
DISPLAY "[Item Name] " WITH NO ADVANCING.
DISPLAY "[Manufacturer] " WITH NO ADVANCING.
DISPLAY "[Number of Pieces*Price]" WITH NO ADVANCING.
DISPLAY "".
DISPLAY "====================" WITH NO ADVANCING.
DISPLAY "====================" WITH NO ADVANCING.
DISPLAY "====================" WITH NO ADVANCING.
DISPLAY "====================" WITH NO ADVANCING.
PRINT-DATA.
DISPLAY itemquantity WITH NO ADVANCING.
DISPLAY " " WITH NO ADVANCING.
DISPLAY itemname WITH NO ADVANCING.
DISPLAY " " WITH NO ADVANCING.
DISPLAY itemmanufacturer WITH NO ADVANCING.
DISPLAY " " WITH NO ADVANCING.
DISPLAY itemquantity WITH NO ADVANCING.
DISPLAY "*" WITH NO ADVANCING
DISPLAY itemprice WITH NO ADVANCING.
DISPLAY "".
MULTIPLY itemprice BY itemquantity GIVING temp.
ADD temp total GIVING total.
答案 0 :(得分:3)
在最后一分钟,我修改了名称,因此修复了这一点,并将吉尔伯特关于正在排序的文件上数据位置的观点纳入其中。
我认为COBOL内部排序往往会使事情“复杂化”,但这是另一个问题。
SORT SORT-ITEMREC
ON ASCENDING KEY itemname
USING ITEMREC
GIVING OUT-ITEMREC.
上面的项目名称应该在SORT-ITEMREC的SD下定义,你可以在ITEMREC的FD下面,至少在你所展示的内容中。
如果您还没有在这里输入错误,我不知道为什么这不是编译器错误。
您使用的是什么COBOL和操作系统?
您的数据名称太相似,因此容易混淆。如果您使数据名称更有意义,则甚至无法解决以下问题:
FD ITEMREC.
01 item.
02 input-itemnum PIC X(10).
02 input-itemname PIC X(20).
02 input-itemmanufacturer PIC X(20).
02 input-itemquantity PIC 99 VALUE ZEROS.
02 input-itemprice PIC 99 VALUE ZEROS.
SD SORT-ITEMREC.
01 sort-item.
02 filler PIC X(10).
02 sortwork-area-only-itemname PIC X(20).
02 filler PIC X(24).
FD OUT-ITEMREC.
01 out-item.
02 sorted-itemname PIC X(20).
02 filler PIC X(34).
SORT SORT-ITEMREC
ON ASCENDING KEY input-itemname
USING ITEMREC
GIVING OUT-ITEMREC.
当您编写类似的代码(例如,尽可能使其具有描述性)时, 要自己思考“我怎样才能对'input-itemname'进行排序,当然我需要'SORTWORK个区域仅-ITEMNAME'?
SORT SORT-ITEMREC
ON ASCENDING KEY sortwork-area-only-itemname
USING ITEMREC
GIVING OUT-ITEMREC.
命名为“排序键”,作为“正在排序”的文件的一部分,该文件是SD。
数据名称的更改随后会显示您的真实问题。
您正在使用未排序的数据记录布局。但是你正在阅读的文件是排序,你已经发现,对你自己来说,你还没有意识到它解决了你的问题。
给一切好名字。明白一点。特定的问题应该变得更加清晰,然后你自己解决它们。
请花时间告诉我们哪个编译器,因为它似乎有一个错误,除非第一件事只是一个错字 - 更难以制作/更容易找到良好的命名。
答案 1 :(得分:1)
您的排序项记录必须与您的项目记录和输出项目记录相匹配。
试试这个。
FD ITEMREC.
01 item.
02 itemnum PIC X(10).
02 itemname PIC X(20).
02 itemmanufacturer PIC X(20).
02 itemquantity PIC 99 VALUE ZEROS.
02 itemprice PIC 99 VALUE ZEROS.
SD SORT-ITEMREC.
01 sort-item.
02 filler PIC X(10).
02 itemname2 PIC X(20).
02 filler PIC X(24).
FD OUT-ITEMREC.
01 out-item.
02 filler PIC X(10).
02 itemname3 PIC X(20).
02 filler PIC X(24).