COBOL - Comando EVALUATE - www.cadcobol.com.br
IF ACONTA EQUAL ZEROES EVALUATE TRUE WHEN BCONTA = 2 MOVE 16 TO K MOVE 0 TO CCONTA DCONTA WHEN BCONTA = 3 MOVE 20 TO FATOR WHEN BCONTA = 4 MOVE BCONTA TO FATOR WHEN BCONTA = 5 IF CAR-ENTRA EQUAL "X" OR "x" MOVE 1 TO FATOR ELSE MOVE 2 TO FATOR END-IF WHEN BCONTA = 6 IF CAR-ENTRA EQUAL "N" OR "n" MOVE 3 TO FATOR ELSE MOVE 4 TO FATOR END-IF END-EVALUATE END-IF.
EVALUATE WSS-TIPO-ACAO WHEN "I" PERFORM R100-ROTINA-INCLUIR THRU R100-FIM WHEN "A" PERFORM R200-ROTINA-ALTERAR THRU R200-FIM WHEN "E" PERFORM R300-ROTINA-EXCLUIR THRU R300-FIM WHEN OTHER PERFORM R900-ROTINA-ERRO THRU R900-FIM END-EVALUATE.
EVALUATE MEDIA WHEN 90 THRU 100 MOVE "A" TO GRAU WHEN 80 THRU 89 MOVE "B" TO GRAU WHEN 70 THRU 79 MOVE "C" TO GRAU WHEN 60 THRU 69 MOVE "D" TO GRAU WHEN 00 THRU 59 MOVE "F" TO GRAU WHEN OTHER PERFORM R900-ROTINA-ERRO THRU R900-FIM END-EVALUATE.
EVALUATE TRUE WHEN MEDIA >= 90 AND <= 100 MOVE "A" TO GRAU WHEN MEDIA >= 80 AND <= 89 MOVE "B" TO GRAU WHEN MEDIA >= 70 AND <= 79 MOVE "C" TO GRAU WHEN MEDIA >= 60 AND <= 69 MOVE "D" TO GRAU WHEN MEDIA >= 00 AND <= 59 MOVE "F" TO GRAU WHEN OTHER PERFORM R900-ROTINA-ERRO THRU R900-FIM END-EVALUATE.
EVALUATE IDADE WHEN 0 THRU 19 PERFORM R100-ROTINA-MENOR WHEN 20 THRU 99 PERFORM R200-ROTINA-ADULTO WHEN OTHER PERFORM R900-ROTINA-VER-IDADE END-EVALUATE.
EVALUATE TRUE WHEN IDADE >= 0 AND <= 19 PERFORM R100-ROTINA-MENOR WHEN IDADE >= 20 AND <= 99 PERFORM R200-ROTINA-ADULTO WHEN OTHER PERFORM R900-ROTINA-VER-IDADE END-EVALUATE.
EVALUATE IDADE <= 19 WHEN TRUE PERFORM R100-ROTINA-MENOR WHEN FALSE PERFORM R200-ROTINA-ADULTO END-EVALUATE.
EVALUATE TRUE WHEN IDADE <= 19 PERFORM R100-ROTINA-MENOR WHEN OTHER PERFORM R200-ROTINA-ADULTO END-EVALUATE.
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.
* 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
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
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.
Os exemplos do comando EVALUATE abaixo descritos trazem o mesmo resultado.
Exemplo do comando EVALUATE usando o nível 88 (oitenta e oito).
* Por favor esqueçam essa codificação IF NU-INDIC-CREDITO OF CADTB055 EQUAL 12 MOVE WE-MOVIMENTO TO WS-MOV-SAIDA-CX MOVE 'IF' TO WS1-BANCO PERFORM P2003-GRAVA-CONTRATO-CX ELSE IF NU-INDIC-CREDITO OF CADTB055 EQUAL 16 MOVE WE-MOVIMENTO TO WS-MOV-SAIDA-CX MOVE 'CA' TO WS1-BANCO PERFORM P2003-GRAVA-CONTRATO-CX ELSE IF NU-INDIC-CREDITO OF CADTB055 EQUAL 25 MOVE WE-MOVIMENTO TO WS-MOV-SAIDA-CX MOVE 'CI' TO WS1-BANCO PERFORM P2003-GRAVA-CONTRATO-CX ELSE IF NU-INDIC-CREDITO OF CADTB055 EQUAL 30 MOVE WE-MOVIMENTO TO WS-MOV-SAIDA-CX MOVE 'CP' TO WS1-BANCO PERFORM P2003-GRAVA-CONTRATO-CX ELSE IF NU-INDIC-CREDITO OF CADTB055 EQUAL 34 MOVE WE-MOVIMENTO TO WS-MOV-SAIDA-CX MOVE 'CN' TO WS1-BANCO PERFORM P2003-GRAVA-CONTRATO-CX ELSE IF NU-INDIC-CREDITO OF CADTB055 EQUAL 38 MOVE WE-MOVIMENTO TO WS-MOV-SAIDA-CX MOVE 'TM' TO WS1-BANCO PERFORM P2003-GRAVA-CONTRATO-CX ELSE IF NU-INDIC-CREDITO OF CADTB055 EQUAL 61 MOVE WE-MOVIMENTO TO WS-MOV-SAIDA-CX MOVE 'SE' TO WS1-BANCO PERFORM P2003-GRAVA-CONTRATO-CX END-IF END-IF END-IF END-IF END-IF END-IF END-IF * Lógica desenvolvida por DORNELLES Carlos Alberto MOVE WE-MOVIMENTO TO WS-MOV-SAIDA-CX EVALUATE NU-INDIC-CREDITO OF CADTB055 WHEN 12 MOVE 'IF' TO WS1-BANCO WHEN 16 MOVE 'CA' TO WS1-BANCO WHEN 25 MOVE 'CI' TO WS1-BANCO WHEN 30 MOVE 'CP' TO WS1-BANCO WHEN 34 MOVE 'CN' TO WS1-BANCO WHEN 38 MOVE 'TM' TO WS1-BANCO WHEN 61 MOVE 'SE' TO WS1-BANCO END-EVALUATE PERFORM P2003-GRAVA-CONTRATO-CX