1

我正在尝试按项目名称对一组项目进行排序,这是 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.
4

2 回答 2

3

在最后一分钟,我修改了名称,所以已经修复了这个问题,并结合了吉尔伯特关于正在排序的文件中数据位置的观点。

我认为 COBOL 内部排序往往会使事情“复杂化”,但这是另一个问题。

SORT SORT-ITEMREC
 ON ASCENDING KEY itemname
 USING ITEMREC
 GIVING OUT-ITEMREC.

上面的 itemname 应该在 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-area-only-itemname'?

SORT SORT-ITEMREC    
   ON ASCENDING KEY sortwork-area-only-itemname
 USING ITEMREC
 GIVING OUT-ITEMREC.

命名的“排序键”作为“正在排序”的文件的一部分,即 SD 文件。

稍后,数据名称的更改会揭示您的真正问题。

您正在使用未排序的数据记录布局。但是您正在阅读的文件是已排序的文件,您已经发现,您自己还没有意识到它可以解决您的问题。

给一切起个好名字。让它显而易见。特定问题对您来说应该变得更加清晰,然后您可以自己解决它们。

请花点时间告诉我们哪个编译器,因为它似乎有一个错误,除非第一件事只是一个错字 - 也更难制作/更容易通过良好的命名来发现。

于 2013-06-29T11:59:29.703 回答
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).
于 2013-06-28T16:26:25.320 回答