Menu principal                 [Fechar]


Linguagem de programação COBOL - EVALUATE


Volta a página anterior

Volta ao Menu Principal


Desenvolvido por DORNELLES Carlos Alberto - Analista de Sistemas - Brasília DF.

EVALUATE
A instrução EVALUATE, à semelhança do verbo IF, permite alterar o fluxo do programa em função dos seus dados. Ao encontrar o EVALUATE, cada uma das suas condições será avaliada até se encontrar uma que seja verdadeira. Seguidamente, o código associado a essa condição é executado e, posteriormente, é executada a instrução seguinte ao EVALUATE.

O seu formato geral é:


Sintaxe do comando EVALUATE

Sintaxe do comando EVALUATE



Primeiro exemplo
 
000001     IF  ACONTA EQUAL ZEROES
000002         EVALUATE TRUE
000003           WHEN BCONTA = 2
000004                MOVE 16 TO K
000005                MOVE 0  TO CCONTA DCONTA
000006           WHEN BCONTA = 3
000007                MOVE 20 TO FATOR
000008           WHEN BCONTA = 4
000009                MOVE BCONTA TO FATOR
000010           WHEN BCONTA = 5
000011                IF  CAR-ENTRA EQUAL "X" OR "x"
000012                    MOVE 1 TO FATOR
000013                ELSE
000014                    MOVE 2 TO FATOR
000015                END-IF
000016           WHEN BCONTA = 6
000017                IF  CAR-ENTRA EQUAL "N" OR "n"
000018                    MOVE 3 TO FATOR
000019                ELSE
000020                    MOVE 4 TO FATOR
000021                END-IF
000022         END-EVALUATE
000023     END-IF.
      
 Se a variável de nome ACONTA for 0 (zero), o fluxo avaliará a variável de nome BCONTA.
 Para cada valor possível especificado neste fluxo para essa variável, o programa efetuará uma ação diferente.
 Não se importe com as declarações IF e END-IF dentro das condições.


Segundo exemplo
 
000001     EVALUATE WSS-TIPO-ACAO                                      
000002         WHEN "I"                              
000003              PERFORM R100-ROTINA-INCLUIR THRU R100-FIM                                
000004         WHEN "A"                              
000005              PERFORM R200-ROTINA-ALTERAR THRU R200-FIM                                
000006         WHEN "E"                             
000007              PERFORM R300-ROTINA-EXCLUIR THRU R300-FIM                                
000008         WHEN OTHER                                                
000009              PERFORM R900-ROTINA-ERRO    THRU R900-FIM                                   
000010     END-EVALUATE.                                                
      

 Se a variável de nome WSS-TIPO-ACAO for igual a "I" a rotina R100-ROTINA-INCLUIR será executada,
 se conter o valor "A" a rotina R200-ROTINA-ALTERAR será executada,
 se conter o valor "E" a rotina R300-ROTINA-EXLUIR será executada.
 Caso não satisfaça nenhuma das opções a rotina R900-ROTINA-ERRO será acionada.


Terceiro exemplo
 Também podemos usar uma cláusula THRU com a instrução EVALUATE.
 Suponha que você deseja imprimir os graus de uma turma com base na média de um aluno.
 O código a seguir é válido:

 
000001     EVALUATE MEDIA                                      
000002         WHEN 90 THRU 100                              
000003              MOVE "A" TO GRAU                                
000004         WHEN 80 THRU 89                              
000005              MOVE "B" TO GRAU                                
000006         WHEN 70 THRU 79                           
000007              MOVE "C" TO GRAU
000008         WHEN 60 THRU 69
000009              MOVE "D" TO GRAU
000010         WHEN 00 THRU 59
000011              MOVE "F" TO GRAU                                  
000012         WHEN OTHER                                                
000013              PERFORM R900-ROTINA-ERRO THRU R900-FIM                                   
000014     END-EVALUATE.                                                
      

 O exemplo número 3 (tres) também poderia ser codificado da seguinte maneira:

 
000001     EVALUATE TRUE                                      
000002         WHEN MEDIA >= 90 AND <= 100                              
000003              MOVE "A" TO GRAU                                
000004         WHEN MEDIA >= 80 AND <= 89                              
000005              MOVE "B" TO GRAU                                
000006         WHEN MEDIA >= 70 AND <= 79                           
000007              MOVE "C" TO GRAU
000008         WHEN MEDIA >= 60 AND <= 69
000009              MOVE "D" TO GRAU
000010         WHEN MEDIA >= 00 AND <= 59
000011              MOVE "F" TO GRAU                                  
000012         WHEN OTHER                                                
000013              PERFORM R900-ROTINA-ERRO THRU R900-FIM                                   
000014     END-EVALUATE.                                                
      

Quarto exemplo - apresentando 4 (quatro) variações da mesma situação:
 
000001     EVALUATE IDADE                                      
000002         WHEN  0 THRU 19                               
000003              PERFORM R100-ROTINA-MENOR                                
000004         WHEN 20 THRU 99                              
000005              PERFORM R200-ROTINA-ADULTO                                
000006         WHEN OTHER                                                
000007              PERFORM R900-ROTINA-VER-IDADE                                   
000008     END-EVALUATE.                                                
      

 
000001     EVALUATE TRUE                                      
000002         WHEN IDADE >=  0 AND <= 19                               
000003              PERFORM R100-ROTINA-MENOR                                
000004         WHEN IDADE >= 20 AND <= 99                              
000005              PERFORM R200-ROTINA-ADULTO                                
000006         WHEN OTHER                                                
000007              PERFORM R900-ROTINA-VER-IDADE                                   
000008     END-EVALUATE.                                                
      

 
000001     EVALUATE IDADE <= 19                                      
000002         WHEN TRUE                               
000003              PERFORM R100-ROTINA-MENOR                                
000004         WHEN FALSE                              
000005              PERFORM R200-ROTINA-ADULTO                                
000006     END-EVALUATE.                                                
      

 
000001     EVALUATE TRUE                                      
000002         WHEN IDADE <= 19                               
000003              PERFORM R100-ROTINA-MENOR                                
000004         WHEN OTHER                              
000005              PERFORM R200-ROTINA-ADULTO                                
000006     END-EVALUATE.                                                
      


Quinto exemplo:
 
           EVALUATE (WS-CARLOS01 = 10) ALSO (WS-CARLOS02 = 20)     
               WHEN TRUE ALSO TRUE                                  
                    PERFORM R100-TRUE-TRUE   THRU R100-FIM  
               WHEN TRUE ALSO FALSE                                 
                    PERFORM R200-TRUE-FALSE  THRU R200-FIM  
               WHEN FALSE ALSO TRUE                                 
                    PERFORM R300-FALSE-TRUE  THRU R300-FIM  
               WHEN FALSE ALSO FALSE                                
                    PERFORM R400-FALSE-FALSE THRU R400-FIM  
           END-EVALUATE.
            

Sexto exemplo - estudo de situações encontradas - N o v o

      *    As variáveis WSS-CONTA-01 e WSS-CONTA-02 podem conter os valores 10, 20 ou 30 
      *    e todas as combinações possiveis entre eles   

           WSS-CONTA-01 = 10 E WSS-CONTA-02 = 10
           WSS-CONTA-01 = 10 E WSS-CONTA-02 = 20
           WSS-CONTA-01 = 10 E WSS-CONTA-02 = 30

           WSS-CONTA-01 = 20 E WSS-CONTA-02 = 10
           WSS-CONTA-01 = 20 E WSS-CONTA-02 = 20
           WSS-CONTA-01 = 20 E WSS-CONTA-02 = 30

           WSS-CONTA-01 = 30 E WSS-CONTA-02 = 10
           WSS-CONTA-01 = 30 E WSS-CONTA-02 = 20
           WSS-CONTA-01 = 30 E WSS-CONTA-02 = 30
      

        
      *    Por favor esqueçam essa codificação
         
           IF WSS-CONTA-01 EQUAL 10 AND 
              WSS-CONTA-02 EQUAL 10
              PERFORM P1010-PROCESSA THRU P1010-FIM
           ELSE
              IF WSS-CONTA-01 EQUAL 10 AND 
                 WSS-CONTA-02 EQUAL 20
                 PERFORM P1020-PROCESSA THRU P1020-FIM
              ELSE
                 IF WSS-CONTA-01 EQUAL 10 AND 
                    WSS-CONTA-02 EQUAL 30
                    PERFORM P1030-PROCESSA THRU P1030-FIM
                 ELSE
                    IF WSS-CONTA-01 EQUAL 20 AND 
                       WSS-CONTA-02 EQUAL 10
                       PERFORM P2010-PROCESSA THRU P2010-FIM
                    ELSE
                       IF WSS-CONTA-01 EQUAL 20 AND
                          WSS-CONTA-02 EQUAL 20
                          PERFORM P2020-PROCESSA THRU P2020-FIM
                       ELSE
                          IF WSS-CONTA-01 EQUAL 20 AND 
                             WSS-CONTA-02 EQUAL 30
                             PERFORM P2030-PROCESSA THRU P2030-FIM
                          ELSE 
                             IF WSS-CONTA-01 EQUAL 30 AND
                                WSS-CONTA-02 EQUAL 10
                                PERFORM P3010-PROCESSA THRU P3010-FIM
                             ELSE 
                                IF WSS-CONTA-01 EQUAL 30 AND 
                                   WSS-CONTA-02 EQUAL 20
                                   PERFORM P3020-PROCESSA THRU P3020-FIM
                                ELSE
                                   PERFORM P3030-PROCESSA THRU P3030-FIM
                                END-IF
                             END-IF
                          END-IF
                       END-IF
                    END-IF
                 END-IF
              END-IF
           END-IF
      

        
      *    Por favor esqueçam essa codificação, tambem
 
           IF WSS-CONTA-01 EQUAL 10
              IF WSS-CONTA-02 EQUAL 10
                 PERFORM P1010-PROCESSA THRU P1010-FIM
              ELSE
                 IF WSS-CONTA-02 EQUAL 20
                    PERFORM P1020-PROCESSA THRU P1020-FIM
                 ELSE
                    PERFORM P1030-PROCESSA THRU P1030-FIM
                 END-IF
              END-IF
           ELSE 
              IF WSS-CONTA-01 EQUAL 20
                 IF WSS-CONTA-02 EQUAL 10
                    PERFORM P2010-PROCESSA THRU P2010-FIM
                 ELSE
                    IF WSS-CONTA-02 EQUAL 20
                       PERFORM P2020-PROCESSA THRU P2020-FIM
                    ELSE
                       PERFORM P2030-PROCESSA THRU P2030-FIM
                    END-IF
                 END-IF
              ELSE 
                 IF WSS-CONTA-02 EQUAL 10
                    PERFORM P3010-PROCESSA THRU P3010-FIM
                 ELSE
                    IF WSS-CONTA-02 EQUAL 20
                       PERFORM P3020-PROCESSA THRU P3020-FIM
                    ELSE
                       PERFORM P3030-PROCESSA THRU P3030-FIM
                    END-IF
                 END-IF
              END-IF
           END-IF
      

        
      *    Codificação recomendável
 
           EVALUATE TRUE
              WHEN WSS-CONTA-01 EQUAL 10 
                   EVALUATE WSS-CONTA-02 
                      WHEN 10    PERFORM P1010-PROCESSA THRU P1010-FIM
                      WHEN 20    PERFORM P1020-PROCESSA THRU P1020-FIM
                      WHEN OTHER PERFORM P1030-PROCESSA THRU P1030-FIM
                   END-EVALUATE 
              WHEN WSS-CONTA-01 EQUAL 20 
                   EVALUATE WSS-CONTA-02 
                      WHEN 10    PERFORM P2010-PROCESSA THRU P2010-FIM
                      WHEN 20    PERFORM P2020-PROCESSA THRU P2020-FIM
                      WHEN OTHER PERFORM P2030-PROCESSA THRU P2030-FIM
                   END-EVALUATE 
              WHEN OTHER 
                   EVALUATE WSS-CONTA-02 
                      WHEN 10    PERFORM P3010-PROCESSA THRU P3010-FIM
                      WHEN 20    PERFORM P3020-PROCESSA THRU P3020-FIM
                      WHEN OTHER PERFORM P3030-PROCESSA THRU P3030-FIM
                   END-EVALUATE 
           END-EVALUATE
      

         
      *    Se fizeres essa combinação melhor ainda
 			
      *    crie tres variáveis 

      *-----------------------------------------------------------------
       WORKING-STORAGE SECTION
      *-----------------------------------------------------------------

       01  WSS-AUXILIARES.
           05  WSS-CONTA               PIC 9(004)      VALUE ZEROES. 
           05  WSS-CONTA-R             REDEFINES WSS-CONTA.
               10  WS-CONTA-01-N       PIC 9(002).                        
               10  WS-CONTA-02-N       PIC 9(002).                        

      *-----------------------------------------------------------------
       PROCEDURE DIVISION.
      *-----------------------------------------------------------------

           MOVE WSS-CONTA-01 TO WSS-CONTA-01-N
           MOVE WSS-CONTA-02 TO WSS-CONTA-02-N

           EVALUATE WSS-CONTA
                    WHEN 1010  PERFORM P1010-PROCESSA THRU P1010-FIM
                    WHEN 1020  PERFORM P1020-PROCESSA THRU P1020-FIM
                    WHEN 1030  PERFORM P1030-PROCESSA THRU P1030-FIM
                    WHEN 2010  PERFORM P2010-PROCESSA THRU P2010-FIM
                    WHEN 2020  PERFORM P2020-PROCESSA THRU P2020-FIM
                    WHEN 2030  PERFORM P2030-PROCESSA THRU P2030-FIM
                    WHEN 3010  PERFORM P3010-PROCESSA THRU P3010-FIM
                    WHEN 3020  PERFORM P3020-PROCESSA THRU P3020-FIM
                    WHEN OTHER PERFORM P3030-PROCESSA THRU P3030-FIM
           END-EVALUATE
      

Sétimo exemplo
 
 Este exemplo do comando EVALUATE é um pouco mais complexo e tem abaixo do mesmo o 
 equivalente ao comando IF.

 Exemplo mais complexo do comando EVALUATE:

           EVALUATE A = B ALSO C > D ALSO TRUE
                    WHEN TRUE  ALSO TRUE  ALSO E = F + 15
                         PERFORM ROTINA-1
                    WHEN TRUE  ALSO TRUE  ALSO E > 12
                         PERFORM ROTINA-2
                    WHEN TRUE  ALSO FALSE ALSO ANY
                         PERFORM ROTINA-3
                    WHEN FALSE ALSO TRUE  ALSO ANY
                         PERFORM ROTINA-4
                    WHEN FALSE ALSO FALSE ALSO ANY
                         PERFORM ROTINA-5
           END-EVALUATE.


 O comando IF equivalente ao EVALUATE acima: 


           IF A EQUAL B 
              IF C GREATER THAN D 
                 IF E EQUAL F + 15 
                    PERFORM ROTINA-1
                 ELSE
                    IF E GREATER THAN 12 
                       PERFORM ROTINA-2
                    END-IF
                 END-IF
              ELSE
                 PERFORM ROTINA-3
              END-IF
           ELSE
              IF C GREATER THAN D 
                 PERFORM ROTINA-4
              ELSE
                 PERFORM ROTINA-5
              END-IF
           END-IF
      

Sétimo exemplo
 

 Outro exemplo mais complexo do comando EVALUATE:

      *-----------------------------------------------------------------
       WORKING-STORAGE SECTION. 
      *-----------------------------------------------------------------

       01  WS-AUXILIARES. 
           05 WS-IDADE             PIC 9(003). 
           05 WS-SEXO              PIC X(001). 
           05 WS-DESCRICAO         PIC X(020). 
           05 A                    PIC 9(003). 
           05 B                    PIC 9(004). 
           05 C                    PIC 9(004). 
           05 D                    PIC 9(004). 
           05 E                    PIC 9(005). 
           05 F                    PIC 9(006). 

      *-----------------------------------------------------------------
       PROCEDURE DIVISION. 
      *-----------------------------------------------------------------

           EVALUATE TRUE ALSO TRUE                                     
               WHEN WS-IDADE < 13 ALSO WS-SEXO = 'M'                  
                    MOVE 'MENINO JOVEM'       TO WS-DESCRICAO          
               WHEN WS-IDADE < 13 ALSO WS-SEXO = 'F'                   
                    MOVE 'MENINA JOVEM'       TO WS-DESCRICAO          
               WHEN WS-IDADE > 12 AND WS-IDADE < 20 ALSO WS-SEXO = 'M' 
                    MOVE 'MENINO ADOLESCENTE' TO WS-DESCRICAO          
               WHEN WS-IDADE > 12 AND WS-IDADE < 20 ALSO WS-SEXO = 'F' 
                    MOVE 'MENINA ADOLESCENTE' TO WS-DESCRICAO          
               WHEN WS-IDADE > 19 ALSO WS-SEXO = 'M'          
                    MOVE 'HOMEM ADULTO'       TO WS-DESCRICAO          
               WHEN WS-IDADE > 19 ALSO WS-SEXO = 'F'          
                    MOVE 'MULHER ADULTA'      TO WS-DESCRICAO          
               WHEN OTHER         
                    MOVE 'DADOS INVALIDOS'    TO WS-DESCRICAO          
           END-EVALUATE 

           EVALUATE TRUE ALSO TRUE
               WHEN A + B < 10 ALSO C = 10
                    MOVE 'CASO 1'             TO WS-DESCRICAO
               WHEN A + B > 50 ALSO C = ( D + E ) / F
                    MOVE 'CASO 2'             TO WS-DESCRICAO
               WHEN OTHER
                    MOVE 'OUTROS CASOS'       TO WS-DESCRICAO
           END-EVALUATE.
        

Nono exemplo - N o v o
 

 Os exemplos do comando EVALUATE abaixo descritos trazem o mesmo resultado. 
 
 
      *-----------------------------------------------------------------
       WORKING-STORAGE SECTION.                                         
      *-----------------------------------------------------------------
                                                                        
       01  WS-VARIAVEIS.                                                
           03 WS-CAMPO0                  PIC 9(001) VALUE 0.            
           03 WS-CAMPO1                  PIC 9(001) VALUE 1.            
           03 WS-CAMPO2                  PIC 9(001) VALUE 2.            
           03 WS-CAMPO3                  PIC 9(001) VALUE 3.            
                                                                        
      *-----------------------------------------------------------------
       PROCEDURE DIVISION.                                              
      *-----------------------------------------------------------------
                                                                        
           EVALUATE TRUE                                                
                    WHEN WS-CAMPO0 = 0                                  
                    OR   WS-CAMPO1 = 1                                  
                    OR   WS-CAMPO2 = 2                                  
                    OR   WS-CAMPO3 = 3                                  
                         Ação de tem que ser feita                             
                    WHEN OTHER
                         Ação de tem que ser feita                             
           END-EVALUATE


           EVALUATE TRUE                                                
                    WHEN WS-CAMPO0 = 0                                  
                    WHEN WS-CAMPO1 = 1                                  
                    WHEN WS-CAMPO2 = 2                                  
                    WHEN WS-CAMPO3 = 3                                  
                         Ação de tem que ser feita                             
                    WHEN OTHER                                          
                         Ação de tem que ser feita                             
           END-EVALUATE                                                 
      

Décimo exemplo - N o v o
 

 Exemplo do comando EVALUATE usando o nível 88 (oitenta e oito). 
 
 
      *-----------------------------------------------------------------
       WORKING-STORAGE SECTION.                                         
      *-----------------------------------------------------------------

       01  WS-TRANSACAO. 
           05 WS-TIPO-TRANSACAO          PIC X(001). 
              88 ADICIONA-TRANSACTION    VALUE 'I'. 
              88 ALTERA-TRANSACTION      VALUE 'A'. 
              88 EXCLUI-TRANSACTION      VALUE 'E'.

      *-----------------------------------------------------------------
       PROCEDURE DIVISION.                                              
      *-----------------------------------------------------------------
           

           MOVE TIPO-DE-TRANSACAO TO WS-TIPO-TRANSACAO
                                                             
           EVALUATE TRUE 
               WHEN ADICIONA-TRANSACTION 
                    PERFORM P1000-ADICIONA-REGISTRO 
               WHEN ALTERA-TRANSACTION 
                    PERFORM P2000-ALTERA-REGISTRO 
               WHEN EXCLUI-TRANSACTION 
                    PERFORM P3000-EXCLUI-REGISTRO 
           END-EVALUATE. 
                                                
      

Volta para o início da página

Volta a página anterior

Volta ao Menu Principal