COBOL打印排序文件冗余

时间:2013-06-28 16:08:14

标签: cobol

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

2 个答案:

答案 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).