КОБОЛ Как я могу отсортировать и объединить два неупорядоченных файла? - PullRequest
1 голос
/ 23 февраля 2012

Я работаю над заданием и вроде как врезался в стену.Я собираюсь сделать вопрос очень общим, поскольку я в основном ищу несколько советов и толчок в правильном направлении.Я должен взять два входных файла, записи которых не имеют определенной последовательности, отсортировать их в один выходной файл, исключая при этом определенные записи.До сих пор я понял, что мне нужно кодировать операторы сортировки, такие как:

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                       

Я не понял, что кодировать в процедуре ввода.

PS Есть одинДругая вещь, которую я не понял.Это своего рода сторона, и я не хочу ничего конкретного с этим конкретным вопросом, просто совет.Мы должны исключить записи с 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 Ответ

4 голосов
/ 23 февраля 2012

Проверить эту ссылку . Это дает несколько примеров, иллюстрирующих, как использовать глагол сортировки COBOL. Эта ссылка должна дать вам много подсказок. Что касается диапазонов дат тестирования, рассмотрите возможность сделать это в рамках ПРОЦЕДУРЫ ВВОДА. См. Пример MaleSort.cbl по ссылке, где записи включены / исключены на основании наличия определенного гендерного кода.

Добавление 6 месяцев к дате может быть немного хитрым. В COBOL есть несколько встроенных функций манипулирования датами, но их использование может быть немного выше, чем вы сейчас, но взгляните на: date-of-integer и integer-of -дата и, возможно, 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 году (я не могу поверить, что кто-то все еще будет использовать двухзначные даты в этот день и возраст). Еще одна вещь, на которую стоит обратить внимание, это количество дней - 31 августа плюс 6 месяцев приводят вас к ... февралю, который имеет только 28 или 29 дней.

Веселитесь.

...