Sintaxis
DO CASE
CASE <condição>
...
< instruções >
...
[ CASE <condição> ]
...
< instruções >
...
[ OTHERWISE ]
...
< instruções >
...
ENDCASE
Propósito
El comando DO CASE ... ENDCASE es un comando de programación estructurada que selecciona solamente una alternativa entre un conjunto de caminos para el curso del flujo de ejecución. El camino seleccionado es el primero para el que se evalúa una condición especificada como verdadera.
Argumentos
CASE <condição >
Define un bloque de instrucciones que se ejecutará si la condición especificada se evalúa como verdadera (.T.).
OTHERWISE
Define un bloque de instrucciones que se ejecutará si ninguna de las cláusulas CASE <condição> se evalúa como verdadera.
Utilización
El DO CASE es un comando de control que se debe utilizar para determinar la selección de uno entre varios bloques de instrucciones. El bloque ejecutado es aquel cuya condición especificada en la cláusula
CASE se evalúa como verdadera. La ejecución del bloque seleccionado continúa hasta que se encuentre el próximo CASE, OTHERWISE o ENDCASE. Cuando una cláusula CASE se evalúa como verdadera, no se evaluará ninguna otra.
Después de la ejecución de las instrucciones contenidas en el bloque seleccionado, el flujo de ejecución se desvía hacia la línea de instrucción inmediatamente después del ENDCASE. Por lo tanto, es obligatoria la existencia del ENDCASE (final del DO CASE) al final de la estructura del comando DO CASE.
La cláusula OTHERWISE es un camino alternativo que se seguirá si ninguna condición especificada en las cláusulas CASE se ha evaluado como verdadera. Por lo tanto, si todas las condiciones especificadas en las cláusulas CASE son falsas y existe el comando OTHERWISE, se ejecutará el bloque de instrucciones entre la cláusula OTHERWISE y ENDCASE. Si la cláusula OTHERWISE no se especificó, el flujo de ejecución se desvía a la primera línea de instrucciones después del ENDCASE.
Varios comandos DO CASE intercalados están permitidos, es decir, unos dentro de otros, siempre y cuando la intercalación se haga correctamente.
Al incluir pares de otras estructuras de control, como el DO CASE ... ENDCASE, IF ... ENDIF, WHILE ... ENDDO y FOR ... NEXT dentro de un DO CASE principal, estas se deben intercalar correctamente. Es decir, se deben iniciar y finalizar dentro de la estructura DO CASE ... ENDCASE principal.
No hay limitaciones para el número de estructuras de control que se pueden intercalar. También no hay límite para el número de cláusulas CASE que pueden existir dentro de una estructura DO CASE ... ENDCASE.
Sugerencias
La cláusula CASE <condição> define una declaración condicional que se avaluará como falsa o verdadera. Esta condición debe ser una expresión lógica, tal como los ejemplos abajo:
- A == B
- nVar1 < 11
- nVop == 1
- cNome == “Cosentino”
En situaciones en que puede haber sólo una condición evaluada como verdadera o en que solamente se debe ejecutar la primera condición, el uso del DO CASE es más indicado que el comando IF ... ENDIF.
Por otro lado, el comando IF ... ELSEIF ... ENDIF se puede utilizar como sustituto del comando DO CASE ... ENDCASE. Su funcionamiento es equivalente: cada CASE corresponde a un ELSEIF y el OTHERWISE al ELSE.
Siempre se debe seguir la técnica de sangría. Cada bloque de instrucciones debe estar sangrado (contenido) dentro de un CASE, de acuerdo con el siguiente ejemplo ilustrado.
Ejemplos
La función a continuación, decide sobre el porcentaje de descuento que se aplicará sobre el sueldo de los empleados, de acuerdo con cada rango de sueldo:
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