COBOL打印排序文件冗余

COBOL打印排序文件冗余,cobol,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 ite

我想按项目名称对一组项目进行排序, 下面是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).
以下是过程部分的排序语句:

SORT SORT-ITEMREC
     ON ASCENDING KEY itemname
     USING ITEMREC
     GIVING OUT-ITEMREC.
下面是“SORTED_groffy.DAT”的打印:


“SORTED_screery.DAT”的内容是排序值,但打印时,它仅打印DAT文件的第一个条目,并替换所有其他值。但是当我通过在上面的代码块中将“OUT-ITEMREC”替换为“ITEMREC”来打印“groffy.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.

排序项目记录必须与项目记录和输出项目记录相匹配

试试这个

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

排序项目记录必须与项目记录和输出项目记录相匹配

试试这个

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

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

我认为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文件

随后,数据名称的更改揭示了您真正的问题

您正在使用未排序的数据记录布局。但是您正在读取的文件是已排序的文件,您已经发现,对于您自己来说,您只是还没有意识到它解决了您的问题

给每件事起个好名字。让它变得明显。你应该更清楚地了解具体的问题,然后你自己去解决它们


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

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

我认为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文件

随后,数据名称的更改揭示了您真正的问题

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

给每件事起个好名字。让它变得明显。具体问题对你来说应该更清楚,然后你自己去解决它们


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

尝试对升序键itemname2进行排序。我已经有一段时间没有使用COBOL了。排序输出是正确的,我在执行后检查了排序后的_.DAT文件,一切正常。问题在于访问并打印该文件时。它只打印第一个条目,并用该条目替换所有后续条目……我必须查看您的表头并打印数据段落,以尝试回答您的问题。您可以尝试的一件事是创建包含所有字段的项记录的工作存储描述,并将输出项记录移动到该工作存储项记录。您的打印数据段落将使用工作存储描述,该描述适用于输入和输出项文件。谢谢吉尔伯特的一个好观点,总是一个开始检查长度、位置和类型的好地方。有帮助。请尝试对升序键itemname2进行排序。我已经有一段时间没有使用COBOL了。排序输出是正确的,我在执行后检查了排序后的_.DAT文件,一切正常。问题在于访问并打印该文件时。它只打印第一个条目,并用该条目替换所有后续条目……我必须查看您的表头并打印数据段落,以尝试回答您的问题。您可以尝试的一件事是创建包含所有字段的项记录的工作存储描述,并将输出项记录移动到该工作存储项记录。您的打印数据段落将使用工作存储描述,该描述适用于输入和输出项文件。谢谢吉尔伯特的一个好观点,总是一个开始检查长度、位置和类型的好地方。有帮助。