Sintaxe
DO CASE
CASE <condição>
...
< instruções >
...
[ CASE <condição> ]
...
< instruções >
...
[ OTHERWISE ]
...
< instruções >
...
ENDCASE
Propósito
O comando DO CASE ... ENDCASE é um comando de programação estruturada que seleciona apenas uma alternativa entre um conjunto de caminhos para o curso do fluxo de execução. O caminho selecionado é o primeiro para o qual uma condição especificada for avaliada como verdadeira.
Argumentos
CASE <condição >
Define um bloco de instruções a ser executado caso a condição especificada seja avaliada como verdadeira (.T.).
OTHERWISE
Define um bloco de instruções a ser executado caso nenhuma das cláusulas CASE <condição> seja avaliada como verdadeira.
Utilização
O DO CASE é um comando de controle que deve ser utilizado para determinar a escolha de um entre vários blocos de instruções. O bloco executado será aquele cuja condição especificada na cláusula CASE for avaliada como verdadeira. A execução do bloco selecionado continua até que o próximo CASE, OTHERWISE ou ENDCASE seja encontrado. Quando uma cláusula CASE é avaliada como verdadeira, nenhuma outra será avaliada.
Após a execução das instruções contidas no bloco selecionado, o fluxo de execução é desviado para a linha de instrução imediatamente seguinte ao ENDCASE. Portanto, é obrigatória a existência do ENDCASE (fim do DO CASE) ao final da estrutura do comando DO CASE.
A cláusula OTHERWISE é um caminho alternativo que será seguido caso nenhuma condição especificada nas cláusulas CASE tenha sido avaliada como verdadeira. Portanto, se todas as condições especificadas nas cláusulas CASE forem falsas e existir o comando OTHERWISE, será executado o bloco de instruções entre a cláusula OTHERWISE e ENDCASE. Caso a cláusula OTHERWISE não foi especificada, o fluxo de execução é desviado para a primeira linha de instruções após o ENDCASE.
Vários comandos DO CASE intercalados, isto é, uns dentro dos outros, é permitido, desde que a intercalação seja feita corretamente.
Ao se incluir pares de outras estruturas de controle, como DO CASE ... ENDCASE, IF ... ENDIF, WHILE ... ENDDO e FOR ... NEXT dentro de um DO CASE principal, estas devem ser corretamente intercaladas. Isto é, devem iniciar-se e finalizar-se dentro da estrutura DO CASE ... ENDCASE principal.
Não há limitações para o número de estruturas de controle que podem ser intercaladas. Também não há limite para o número de cláusulas CASE que podem existir dentro de uma estrutura DO CASE ... ENDCASE.
Dicas
A cláusula CASE <condição> define uma declaração condicional que será avaliada como falsa ou verdadeira. Esta condição deve ser uma expressão lógica, tal como os exemplos abaixo:
- A == B
- nVar1 < 11
- nVop == 1
- cNome == “Cosentino”
Em situações onde pode haver apenas uma condição avaliada como verdadeira ou onde apenas a primeira condição verdadeira deve ser executada, o uso do DO CASE é mais indicado do que o comando IF ... ENDIF.
Por outro lado, o comando IF ... ELSEIF ... ENDIF pode ser utilizado como substituto do comando DO CASE ... ENDCASE. O seu funcionamento é equivalente: cada CASE corresponde a um ELSEIF e o OTHERWISE ao ELSE.
A técnica de indentação deve sempre ser seguida. Cada bloco de instruções deve estar indentado (contido) dentro de um CASE, conforme ilustrado no exemplo a seguir.
Exemplos
A função abaixo decide sobre o percentual de desconto que será aplicado sobre o salário dos funcionários, de acordo com cada faixa salarial:
FUNCTION CalcDesc(nSalario)
LOCAL nDescont := 0
DO CASE
CASE nSalario > 12000 .AND. nSalario < 20000
nDescont := nSalario * 0.10
CASE nSalario >= 20000 .AND. nSalario < 40000
nDescont := nSalario * 0.15
CASE nSalario >= 40000 .AND. nSalario < 60000
nDescont := nSalario * 0.20
CASE nSalario >= 60000 .AND. nSalario < 90000
nDescont := nSalario * 0.25
CASE nSalario >= 90000 .AND. nSalario < 150000
nDescont := nSalario * 0.30
CASE nSalario >= 150000 .AND. nSalario < 200000
nDescont := nSalario * 0.40
OTHERWISE
nDescont := nSalario * 0.50
ENDCASE
RETURN nDescont