COBOL如何排序和合并两个无序文件?

时间:2012-02-22 22:13:34

标签: cobol

我正在完成任务,我有点碰壁。我将提出这个问题非常通用,因为我主要是寻找一些提示并朝着正确的方向推进。我将获取两个输入文件,这些文件的记录没有特定的顺序,将它们分成一个输出文件,同时排除某些条目。到目前为止,我已经发现我需要对排序语句进行编码,如:

SORT ORDERS-FILE-SORT                          
ON ASCENDING REQUEST-DATE-S                
   ASCENDING CUST-NUMBER-S                 
   ASCENDING CUST-ORDER-NUMBER-S           
   ASCENDING PART-NUMBER-S                 
   USING INPUT PROCEDURE 200-SORT-AND-MERGE
   GIVING ORDERS-OUT                       

我还没弄清楚要在输入过程中编写什么代码。

P.S。还有一件我没想到的事情。这是一个方面而不是我并不想要任何具体的这个特定问题,只是一个提示。我们应该排除REQUEST-DATE不在6个月内的记录。起初我觉得它很简单:

01 WS-DATE
    05 RUN-YEAR            PIC 99.
    05 RUN-MONTH           PIC 99.
    05 RUN-DAY             PIC 99.

300-TEST-DATE
    ADD 6 TO RUN-MONTH
    IF REQUEST-DATE > WS-DATE

但是,如果在月份中添加6个会使其超过12,则无法使用。我一直对这个问题感到头痛。感谢您的帮助,我将非常感激。

1 个答案:

答案 0 :(得分:4)

结帐this link。它提供了几个说明如何使用COBOL排序动词的示例。这个链接应该给你很多提示。至于测试日期范围,请考虑在INPUT PROCEDURE中进行测试。请参阅基于具有特定性别代码的记录被包含/排除的链接中的MaleSort.cbl示例。

添加6个月的日期可能有点窍门。 COBOL中有许多固有的日期操作函数,但使用它们可能会超出您现在的位置,但请查看:date-of-integerinteger-of-date以及dateval 。另一方面,您可能会发现自己很容易进行算术运算。

如果您选择进行自己的日期数学运算,请尝试以下方式:

             ADD 6 TO RUN-MONTH
             DIVIDE RUN-MONTH BY 12 
                 GIVING WS-YEAR-ROLLOVER
                 REMAINDER IN RUN-MONTH
             END-DIVIDE
             COMPUTE RUN-YEAR = RUN-YEAR + WS-YEAR-ROLLOVER

由于您的RUN-YEAR只有2位数字,如果WS-DATE在2000年之前,您可能不得不处理世纪展期(我不相信任何人在这一天仍会使用2位数日期和年龄)。需要注意的另一件事是天数 - 8月31日加6个月让你... 2月只有28天或29天。

玩得开心。