Одна из первых вещей, которую вы должны изучить как программист, COBOL или как-то еще, - это определить, какие ваши требования действительно существуют.Ваше задание просит сравнить две даты и выполнить определенные действия, если одна проходит 6 месяцев или менее после другой.Точно, что означает 6 месяцев?Будет ли это: 183 дня;будет ли это номер месяца плюс 6, в таком случае даты 2011-01-31 и 2011-07-01 будут разделяться на 6 месяцев, но на 33 дня меньше альтернативного определения 183 дня;Возможны и другие определения.Даты и, в частности, арифметика дат могут сбивать с толку.
Далее, остерегайтесь различных форматов дат: ГГММДД;YYYYMMDD;ММДДГГГГ;ДДММГГГГ, а может и больше.Оператор ACCEPT WS-DATE FROM DATE
может дать вам формат даты, отличный от того, который вы ожидаете (параметры времени компиляции и / или установки по умолчанию могут повлиять на формат).Как правило, лучше запрашивать явный формат даты, как в ACCEPT WS-YYYYMMDD FROM DATE YYYYMMDD
.Одна из проблем в вашей программе связана с этим.Вы смешиваете 2- и 4-значные годы, например:
MOVE REQUEST-YEAR-P-IN TO YEAR-CHECK
Перемещает год из четырех цифр в год из двух цифр.Как вы думаете, что там обрезали?Это, в свою очередь, портит все ваше утверждение EVALUATE
(которое я рекомендую не использовать так, как вы используете в этой программе).
Далее, я думаю, вам было бы лучше воспользоваться преимуществами представления вам датво входном файле.Они в формате ГГГГММДД.Все, что вам нужно сделать, это вычислить дату и дату через 6 месяцев от текущей даты и сравнить ее непосредственно с датой из входного файла.Если введенная дата численно меньше расчетной, сохраните запись.
Попробуйте что-то вроде:
10 WS-YYYYMMDD.
15 WS-YYYY PIC 9(4).
15 WS-MM PIC 9(2).
15 WS-DD PIC 9(2).
100-MAIN.
*
* Calculate a reference date 6 months into the future.
*
ACCEPT WS-YYYYMMDD FROM DATE YYYYMMDD
COMPUTE WS-MM = WS-MM + 6 END-COMPUTE
IF WS-MM > 12
COMPUTE WS-MM = WS-MM - 12 END-COMPUTE
COMPUTE WS-YYYY = WS-YYYY + 1 END-COMPUTE
END-IF
....
210-SORT-ADD-PRIOR.
IF REQUEST-DATE-P-IN < WS-YYYYMMDD
MOVE ORDERS-RECORD-PRIOR-IN TO ORDERS-RECORD-SORT
RELEASE ORDERS-RECORD-SORT
END-IF
.
Или что-то в этом роде ... но избавьтесь от этого огромного EVALUATE
.