日期检查(COBOL)

时间:2011-02-27 16:33:43

标签: cobol

作为作业的一部分,我需要创建一个“运送”程序,该程序会检查某个字段,该字段指示项目的发货日期。在对其余数据进行排序时,将省略任何日期超过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 个答案:

答案 0 :(得分:2)

作为程序员,COBOL或其他方式,您应该学习的第一件事就是确定您的要求是什么。您的作业要求比较两个日期并执行某些操作(如果一个是6个月或更少)。究竟6个月是什么意思?它会是:183天;它是月份数加6,在这种情况下,2011-01-31和2011-07-01的日期相隔6个月 - 但比183天的替代定义短33天;其他定义也是可能的。日期和日期算术尤其令人困惑。

接下来,请注意不同的日期格式:YYMMDD;年月日; MMDDYYYY; DDMYYYYY可能更多。 ACCEPT WS-DATE FROM DATE语句可能会为您提供与您期望的日期格式不同的日期格式(编译时选项和/或编译器安装默认值可能会影响格式)。通常,在ACCEPT WS-YYYYMMDD FROM DATE YYYYMMDD中请求明确的日期格式是更好的形式。您的计划中的一个问题与此有关。你混合2到4位数,如:

MOVE REQUEST-YEAR-P-IN TO YEAR-CHECK   

将4位数年份移至两位数年份。你认为那被截断了什么?这反过来会弄乱你的整个EVALUATE声明(我建议不要使用你在这个程序中的方式)。

接下来我认为你最好利用日期在输入文件中呈现给你的方式。它们采用YYYYMMDD格式。您需要做的就是从当前日期开始计算未来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 :(得分:1)

如果您想知道日期是否提前6个月,我认为只计算几个月

更容易

比较

Year-today * 12 + month-Today + 6 

使用

Year-Shipping * 12 + month-Shipping  

你已经完成了。

答案 2 :(得分:1)

我只能假设这对于帮助完成作业来说太晚了,但是使用内在的 FUNCTION INTEGER-OF-DATE 可能会比较未来日期的比较。之后你只需要整数比较。假设日期在16010101和99991231范围内,你应该很高兴(Gregorian)。

答案 3 :(得分:0)

       IF MONTH-TOTAL > 12
           SUBTRACT 12 FROM MONTH-TOTAL
       END-IF

也许你需要在IF中添加1年? 我甚至不会尝试在COBOL

中编写它

答案 4 :(得分:0)

我会在程序开始时建议

  1. 您计算未来6个月的日期(并以YYYYMMDD格式存储)。
  2. 然后,您可以比较REQUEST-DATE-P-IN&gt;计算最新
  3. 计算未来日期:

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

    这比评估

    简单得多