Проверка даты (COBOL) - PullRequest
       3

Проверка даты (COBOL)

2 голосов
/ 27 февраля 2011

В рамках задания мне нужно создать программу «отгрузки», которая проверяет определенное поле, в котором указывается дата отправки товара.Любая запись с датой более 6 месяцев должна быть пропущена при сортировке остальных данных.

Проблема не в том, что я пытаюсь получить плохие результаты.Я подумал, что EVALUATE заявление будет лучшим путем, но я просто не могу понять, как это правильно.Вот что у меня внизу:

   DATA DIVISION.
   FILE SECTION.
       COPY ORDERS-FILE-NEW-IN.COP.
   FD  ORDERS-FILE-NEW-IN.
   01  ORDERS-RECORD-NEW-IN.
       05  PART-NUMBER-N-IN        PIC X(8).
       05  QUANTITY-N-IN           PIC 9(4).
       05  REQUEST-DATE-N-IN.          
           10  REQUEST-YEAR-N-IN   PIC X(4).  
           10  REQUEST-MONTH-N-IN  PIC XX.   
           10  REQUEST-DAY-N-IN    PIC XX.   
       05  CUST-NUMBER-N-IN        PIC X(5).
       05  CUST-ORDER-NUMBER-N-IN  PIC X(10).   
       05  STOCK-AVAILABLE-N-IN    PIC X.
       COPY ORDERS-FILE-PRIOR-IN.COP.
   FD  ORDERS-FILE-PRIOR-IN. 
   01  ORDERS-RECORD-PRIOR-IN.
       05  PART-NUMBER-P-IN        PIC X(8).
       05  QUANTITY-P-IN           PIC 9(4).
       05  REQUEST-DATE-P-IN.          
           10  REQUEST-YEAR-P-IN   PIC X(4).  
           10  REQUEST-MONTH-P-IN  PIC XX.   
           10  REQUEST-DAY-P-IN    PIC XX.   
       05  CUST-NUMBER-P-IN        PIC X(5).
       05  CUST-ORDER-NUMBER-P-IN  PIC X(10).   
       05  STOCK-AVAILABLE-P-IN    PIC X.
       COPY ORDERS-FILE-SORT.COP.
   SD  ORDERS-FILE-SORT.
   01  ORDERS-RECORD-SORT.
       05  PART-NUMBER-S           PIC X(8).
       05  QUANTITY-S              PIC 9(4).
       05  REQUEST-DATE-S.             
           10  REQUEST-YEAR-S      PIC X(4).  
           10  REQUEST-MONTH-S     PIC XX.   
           10  REQUEST-DAY-S       PIC XX.   
       05  CUST-NUMBER-S           PIC X(5).
       05  CUST-ORDER-NUMBER-S     PIC X(10).   
       05  STOCK-AVAILABLE-S       PIC X.

   FD  ORDERS-FILE-OUT.
   01  ORDERS-RECORD-OUT           PIC X(80).

   WORKING-STORAGE SECTION.
   01  ARE-THERE-MORE-RECORDS      PIC X(3)  VALUE 'YES'.

   01  REPORT-START                PIC X     VALUE 'Y'.

   01  LINE-COUNT                  PIC 99    VALUE ZEROS.

   01  LINE-JUMP                   PIC X     VALUE 'Y'.

   01  PAGE-NUMBER                 PIC 99    VALUE ZEROS.

   01  MONTH-TOTAL                 PIC 99    VALUE ZEROS.

   01  YEAR-TOTAL                  PIC 99    VALUE ZEROS.

   01  YEAR-CHECK                  PIC 99    VALUE ZEROS.

   01  SPACE-LINE                  PIC X     VALUE SPACE.

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

   01  HEADING-LINE-1.
       05                          PIC X(15) VALUE SPACES.
       05                          PIC X(43)
           VALUE 'OPEN ORDERS REPORT - NEXT SIX MONTHS'.
       05  HL-1-DATE.
           10  MONTH-1              PIC 99.
           10                       PIC X      VALUE '/'.
           10  DAY-1                PIC 99.
           10                       PIC X      VALUE '/'.
           10  YEAR-1               PIC 99.
       05                           PIC X(3)   VALUE SPACES.
       05  PAGE-1                   PIC X(5)   VALUE 'PAGE'.
       05  NUMBER-PAGE              PIC Z9.

   01  HEADING-LINE-2.
       05                           PIC X(14)
           VALUE 'REQUEST DATE'.
       05                           PIC X(12)
           VALUE 'CUSTOMER #'.
       05                           PIC X(16)
           VALUE 'CUSTOMER ORD #'.
       05                           PIC X(10)
           VALUE 'PART #'.
       05                           PIC X(11)
           VALUE 'QUANTITY'.
       05                           PIC X(8)
           VALUE 'AVAIL'.
       05                           PIC X(5)
           VALUE 'SHIP?'.

   01  DETAIL-LINE.
       05  REQUEST-DATE.
           10  REQUEST-MONTH        PIC XX.
           10                       PIC X     VALUE '/'.
           10  REQUEST-DAY          PIC XX.
           10                       PIC X     VALUE '/'.
           10  REQUEST-YEAR         PIC X(4).
       05                           PIC X(4)  VALUE SPACES.
       05  CUST-NUMBER              PIC X(5).
       05                           PIC X(7)  VALUE SPACES.
       05  CUST-ORDER-NUMBER        PIC X(10).
       05                           PIC X(6)  VALUE SPACES.
       05  PART-NUMBER              PIC X(8).
       05                           PIC X(5)  VALUE SPACES.
       05  QUANTITY                 PIC Z,ZZZ.
       05                           PIC X(3)  VALUE SPACES.
       05  STOCK-AVAILABLE          PIC X(3).
       05                           PIC X(5)  VALUE SPACES.
       05  SHIP-MESSAGE             PIC X(4).

   PROCEDURE DIVISION.
   100-MAIN.
       SORT ORDERS-FILE-SORT
             ON ASCENDING KEY REQUEST-DATE-S
             ON ASCENDING KEY CUST-NUMBER-S
             ON ASCENDING KEY CUST-ORDER-NUMBER-S
             ON ASCENDING KEY PART-NUMBER-S
             INPUT PROCEDURE 200-SORT-SELECTION
             OUTPUT PROCEDURE 300-FILE-START
       STOP RUN.

   200-SORT-SELECTION.
       OPEN INPUT ORDERS-FILE-NEW-IN
                  ORDERS-FILE-PRIOR-IN

       ACCEPT WS-DATE FROM DATE
       MOVE RUN-MONTH TO MONTH-1
       MOVE RUN-DAY TO DAY-1
       MOVE RUN-YEAR TO YEAR-1

       PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO '
           READ ORDERS-FILE-PRIOR-IN
               AT END
                   MOVE 'NO' TO ARE-THERE-MORE-RECORDS
               NOT AT END
                   PERFORM 210-SORT-ADD-PRIOR
           END-READ
       END-PERFORM

       MOVE 'YES' TO ARE-THERE-MORE-RECORDS

       PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO '
           READ ORDERS-FILE-NEW-IN
               AT END
                   MOVE 'NO' TO ARE-THERE-MORE-RECORDS
               NOT AT END
                   PERFORM 220-SORT-ADD-NEW
           END-READ
       END-PERFORM

       MOVE 'YES' TO ARE-THERE-MORE-RECORDS

       CLOSE ORDERS-FILE-NEW-IN
             ORDERS-FILE-PRIOR-IN.

   210-SORT-ADD-PRIOR.
       MOVE ORDERS-RECORD-PRIOR-IN TO ORDERS-RECORD-SORT
       MOVE MONTH-1 TO MONTH-TOTAL
       MOVE YEAR-1 TO YEAR-TOTAL
       MOVE REQUEST-YEAR-P-IN TO YEAR-CHECK
       ADD 6 TO MONTH-TOTAL
       IF MONTH-TOTAL > 12
           SUBTRACT 12 FROM MONTH-TOTAL
       END-IF
       EVALUATE REQUEST-MONTH-P-IN
           WHEN 01         IF MONTH-TOTAL = 1 OR
                               (MONTH-TOTAL > 6 AND < 13)
                               IF YEAR-CHECK - YEAR-1 = 0 OR 1
                                   RELEASE ORDERS-RECORD-SORT
                               END-IF
                           END-IF

           WHEN 02         IF (MONTH-TOTAL = 1 OR 2) OR
                               (MONTH-TOTAL > 7 AND < 13)
                               IF YEAR-CHECK - YEAR-1 = 0 OR 1
                                   RELEASE ORDERS-RECORD-SORT
                               END-IF
                           END-IF

           WHEN 03         IF (MONTH-TOTAL > 0 AND < 4) OR
                               (MONTH-TOTAL > 8 AND < 13)
                               IF YEAR-CHECK - YEAR-1 = 0 OR 1
                                   RELEASE ORDERS-RECORD-SORT
                               END-IF
                           END-IF

           WHEN 04         IF (MONTH-TOTAL > 0 AND < 5) OR
                               (MONTH-TOTAL > 9 AND < 13)
                               IF YEAR-CHECK - YEAR-1 = 0 OR 1
                                   RELEASE ORDERS-RECORD-SORT
                               END-IF
                           END-IF

           WHEN 05         IF (MONTH-TOTAL > 0 AND < 6) OR
                               (MONTH-TOTAL = 11 OR 12)
                               IF YEAR-CHECK - YEAR-1 = 0 OR 1
                                   RELEASE ORDERS-RECORD-SORT
                               END-IF
                           END-IF

           WHEN 06         IF (MONTH-TOTAL > 0 AND < 7) OR
                               MONTH-TOTAL = 12
                               IF YEAR-CHECK - YEAR-1 = 0 OR 1
                                   RELEASE ORDERS-RECORD-SORT
                               END-IF
                           END-IF

           WHEN 07         IF MONTH-TOTAL > 1 AND < 8
                               IF YEAR-CHECK = YEAR-1
                                   RELEASE ORDERS-RECORD-SORT
                               END-IF
                           END-IF

           WHEN 08         IF MONTH-TOTAL > 2 AND < 9
                               IF YEAR-CHECK = YEAR-1
                                   RELEASE ORDERS-RECORD-SORT
                               END-IF
                           END-IF

           WHEN 09         IF MONTH-TOTAL > 3 AND < 10
                               IF YEAR-CHECK = YEAR-1
                                   RELEASE ORDERS-RECORD-SORT
                               END-IF
                           END-IF

           WHEN 10         IF MONTH-TOTAL > 4 AND < 11
                               IF YEAR-CHECK = YEAR-1
                                   RELEASE ORDERS-RECORD-SORT
                               END-IF
                           END-IF

           WHEN 11         IF MONTH-TOTAL > 5 AND < 12
                               IF YEAR-CHECK = YEAR-1
                                   RELEASE ORDERS-RECORD-SORT
                               END-IF
                           END-IF

           WHEN 12         IF MONTH-TOTAL > 6 AND < 13
                               IF YEAR-CHECK = YEAR-1
                                   RELEASE ORDERS-RECORD-SORT
                               END-IF
                           END-IF

       END-EVALUATE.

Ответы [ 5 ]

2 голосов
/ 04 марта 2011

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

1 голос
/ 17 января 2013

Я могу только предположить, что это слишком поздно, чтобы помочь с домашней работой, но сравнение будущих дат может быть легче с внутренней ФУНКЦИЕЙ INTEGER-OF-DATE . Вам просто нужно целочисленные сравнения после этого. Предполагая, что даты находятся в диапазоне 16010101 и 99991231, вы должны хорошо идти (григорианский).

1 голос
/ 28 февраля 2011

Если вы хотите знать, если дата на 6 месяцев вперед, я думаю, что проще вычислить только месяцы

Сравнить

Year-today * 12 + month-Today + 6 

С

Year-Shipping * 12 + month-Shipping  

и все готово.

0 голосов
/ 28 февраля 2011

Я бы посоветовал при запуске программы

  1. рассчитать дату в будущем через 6 месяцев (и сохранить в формате ГГГГММДД).
  2. Затем можно сравнитьDATE-P-IN> Расчетная дата

Чтобы рассчитать будущую дату:

 Add 6      to month
 if month > 12
    Sub 12       from month
    Add 1          to year
 end-if

Это намного проще, чем оценка

0 голосов
/ 27 февраля 2011
       IF MONTH-TOTAL > 12
           SUBTRACT 12 FROM MONTH-TOTAL
       END-IF

Может быть, вам нужно добавить 1 к году внутри этого IF?
Я даже не буду пытаться написать это на Коболе

...