COBOL - Exemplos simples - PERFORM UNTIL AFTER vs PERFORM UNTIL



Desenvolvido por DORNELLES Carlos Alberto - Analista de Sistemas - Brasília DF. - cad_cobol@hotmail.com

COBOL - Exemplos simples - PERFORM UNTIL AFTER vs PERFORM UNTIL

Fonte do programa


   IDENTIFICATION DIVISION.
   PROGRAM-ID. PERFORM-VARYING-TEST.
   DATA DIVISION.
   FILE SECTION.
   WORKING-STORAGE SECTION.
   
   01  WS-AUXILIARES.
       05  WS-INDEX-1                  PIC 9(009)   VALUE ZEROES.
       05  WS-INDEX-2                  PIC 9(009)   VALUE ZEROES.
       05  WS-COMPUTE-FILLER           PIC 9(016)   VALUE ZEROES.
       05  WS-MAX-VAL                  PIC 9(004)   VALUE 1000.
   
   01  SECS-DEPOIS-MIDNIGHT.
       05  SECS-ANTES                  PIC 9(009).
       05  SECS-DEPOIS                 PIC 9(009).
       05  HORA-DIFERENCA              PIC 9(002).  
       05  MINU-DIFERENCA              PIC 9(002).  
       05  SECS-DIFERENCA              PIC 9(002).
       05  HUND-DIFERENCA              PIC 9(002).  

   01  WS-CURRENT-DATE-ANTES.
       05  WS-A-YEAR                   PIC 9(004).
       05  WS-A-MONTH                  PIC 9(002).
       05  WS-A-DAY                    PIC 9(002).
       05  WS-A-HOUR                   PIC 9(002).
       05  WS-A-MINUTES                PIC 9(002).
       05  WS-A-SECONDS                PIC 9(002).
       05  WS-A-HUNDREDTHS-OF-SECS     PIC 9(002).
       05  WS-A-GMT-DIFF-HOURS         PIC S9(02)
                               SIGN LEADING SEPARATE.
       05  WS-A-GMT-DIFF-MINUTES       PIC 9(002).

   01  WS-CURRENT-DATE-DEPOIS.
       05  WS-B-YEAR                   PIC 9(004).
       05  WS-B-MONTH                  PIC 9(002).
       05  WS-B-DAY                    PIC 9(002).
       05  WS-B-HOUR                   PIC 9(002).
       05  WS-B-MINUTES                PIC 9(002).
       05  WS-B-SECONDS                PIC 9(002).
       05  WS-B-HUNDREDTHS-OF-SECS     PIC 9(002).
       05  WS-B-GMT-DIFF-HOURS         PIC S9(2)
                               SIGN LEADING SEPARATE.
       05  WS-B-GMT-DIFF-MINUTES       PIC 9(002).
   
   PROCEDURE DIVISION.

   000-PROCEDURE.

       DISPLAY "PERFORM UNTIL AFTER TESTS:"
       PERFORM 200-PERFORM 3 TIMES 
       DISPLAY "                       " 
       DISPLAY "PERFORM UNTIL TESTS:" 
       PERFORM 100-PERFORM 3 TIMES 
       STOP RUN. 
        
   100-PERFORM.
       
       MOVE FUNCTION CURRENT-DATE  TO WS-CURRENT-DATE-ANTES.
       MOVE FUNCTION SECONDS-PAST-MIDNIGHT TO SECS-ANTES.

       PERFORM VARYING WS-INDEX-2 FROM 1 BY 1 
         UNTIL WS-INDEX-2 > WS-MAX-VAL
               PERFORM VARYING WS-INDEX-1 FROM 1 BY 1 
                 UNTIL WS-INDEX-1 > WS-MAX-VAL
                       COMPUTE WS-COMPUTE-FILLER = 
                               WS-INDEX-1 - WS-INDEX-2
                       END-COMPUTE 
               END-PERFORM
       END-PERFORM            
       
       MOVE FUNCTION CURRENT-DATE  TO WS-CURRENT-DATE-DEPOIS.
       MOVE FUNCTION SECONDS-PAST-MIDNIGHT TO SECS-DEPOIS.

       PERFORM 300-DISPLAY.

   100-PERFORM-SAI.
       EXIT.
       
   200-PERFORM.
       MOVE FUNCTION CURRENT-DATE  TO WS-CURRENT-DATE-ANTES.
       MOVE FUNCTION SECONDS-PAST-MIDNIGHT TO SECS-ANTES.
       
       PERFORM VARYING WS-INDEX-2 FROM 1 BY 1 
          UNTIL WS-INDEX-2 > WS-MAX-VAL
                AFTER WS-INDEX-1 FROM 1 BY 1 
                UNTIL WS-INDEX-1 > WS-MAX-VAL
                COMPUTE WS-COMPUTE-FILLER = 
                        WS-INDEX-1 - WS-INDEX-2
                END-COMPUTE              
       END-PERFORM            

       MOVE FUNCTION CURRENT-DATE  TO WS-CURRENT-DATE-DEPOIS.
       MOVE FUNCTION SECONDS-PAST-MIDNIGHT TO SECS-DEPOIS.
                  
       PERFORM 300-DISPLAY.
       
   200-PERFORM-SAI.
       EXIT.

   300-DISPLAY.
       DISPLAY SPACE 
       DISPLAY 'Hora inicial  =======> '
            WS-A-YEAR '-' WS-A-MONTH '-' WS-A-DAY '   '
            WS-A-HOUR ':' WS-A-MINUTES ':' WS-A-SECONDS '.' WS-A-HUNDREDTHS-OF-SECS.

       DISPLAY 'Hora final  =========> '
            WS-B-YEAR '-' WS-B-MONTH '-' WS-B-DAY '   '
            WS-B-HOUR ':' WS-B-MINUTES ':' WS-B-SECONDS '.' WS-B-HUNDREDTHS-OF-SECS.

       COMPUTE HORA-DIFERENCA = WS-A-HOUR - WS-B-HOUR 
       COMPUTE MINU-DIFERENCA = WS-A-MINUTES - WS-B-MINUTES
       COMPUTE SECS-DIFERENCA = SECS-DEPOIS - SECS-ANTES
       COMPUTE HUND-DIFERENCA = WS-A-HUNDREDTHS-OF-SECS - WS-B-HUNDREDTHS-OF-SECS
       DISPLAY 'Tempo de execução ===> ' HORA-DIFERENCA ":" MINU-DIFERENCA ":" 
                                         SECS-DIFERENCA ":" HUND-DIFERENCA. 
   300-DISPLAY-SAI.
       EXIT.

Resultado:

TESTE - PERFORM UNTIL AFTER:

Hora inicial =========> 2021-06-22   17:18:21.37
Hora final  ==========> 2021-06-22   17:18:23.37
Tempo de execução  ===> 00:00:02:00

Hora inicial =========> 2021-06-22   17:18:23.37
Hora final  ==========> 2021-06-22   17:18:25.23
Tempo de execução  ===> 00:00:02:14

Hora inicial =========> 2021-06-22   17:18:25.23
Hora final  ==========> 2021-06-22   17:18:27.11
Tempo de execução  ===> 00:00:02:12
TESTE - PERFORM UNTIL:

Hora inicial =========> 2021-06-22   17:18:27.11
Hora final  ==========> 2021-06-22   17:18:28.94
Tempo de execução  ===> 00:00:01:83

Hora inicial =========> 2021-06-22   17:18:28.94
Hora final  ==========> 2021-06-22   17:18:30.78
Tempo de execução  ===> 00:00:02:16

Hora inicial =========> 2021-06-22   17:18:30.78
Hora final  ==========> 2021-06-22   17:18:32.60
Tempo de execução  ===> 00:00:02:18