2013-06-28 36 views
1

我想通过自己的ITEMNAME排序一组项目, 这里的SELECT语句:COBOL打印整理文件冗余

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. 

这里的打印O F“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. 

回答

3

在最后一分钟,我毁损了名,所以有固定的,并且incorporsated有关文件上的数据被排序的位置吉尔伯特的观点。

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

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

ITEMNAME上述假设的SD的排序ITEMREC下定义,你拥有了它,而不是下在FD的ITEMREC,至少在你表现出什么。

如果你不只是在这里打错了,我不知道为什么这不会是一个编译器错误。

您使用的是哪种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. 

(例如,使其尽可能描述可能),你想:如果你让你的数据的名称更有意义,你甚至不能带来问题给自己“我怎么能在‘输入ITEMNAME’排序,我肯定需要‘SORTWORK面积仅-ITEMNAME’?

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

命名的‘排序关键字’为是文件的一部分是“正在排序”,该文件是SD。

数据名称的变化会在稍后显示您真正的问题。

您正在使用您的未分类数据记录布局。但是你正在阅读的文件是排序的之一,并且你已经发现,对于你自己而言,你还没有意识到它可以解决你的问题。

给一切好名字。明显。特定的问题应该对你更加清楚,然后你自己去解决它们。

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

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

感谢您的回复! :)仍然没有工作.. –

+0

尝试按升序键itemname2排序。自从我完成COBOL以来已经有一段时间了。 –

+0

排序输出是正确的,我执行后检查了SORTED_GROCERY.DAT文件,一切都按顺序排列。访问该文件并打印时存在问题。它只是打印第一个条目,并用该条目替换所有后续的条目... –