El comando IF ... ELSE ... ENDIF (SE ... SINO ... FINAL DEL SI) permite condicionar la ejecución de una secuencia de instrucciones. Esta estructura de programación decide entre dos caminos alternativos, dependiendo si una condición especificada es verdadera o falsa. Después de la ejecución de uno de los caminos, los dos caminos se unen nuevamente. Por ejemplo:
// Función de cálculo del Impuesto de renta de persona física (IRPF) FUNCTION CalcIR(nSalario) FUNCTION CalcIR(nSalario) LOCAL nDesconto := 0 IF nSalario > 5000 nDesconto := nSalario * 0.275 ELSE nDesconto := nSalario * 0.15 ENDIF MSGALERT("El descuento sobre el sueldo es de R$ " + Str(nDesconto, 9, 2)) RETURN nDesconto
El comando ELSE es opcional. Si éste no se utiliza, se ejecutará solamente la instrucción referente a la condición lógica verdadera. Observe el siguiente ejemplo:
// Función de cálculo de la comisión del vendedor FUNCTION CalcCom(nTotVen) LOCAL nComissao := 0 IF nTotVen > 50000 nComissao := nTotVen * 0.03 ENDIF MSGALERT("La comisión del vendedor es de R$ " + Str(nComissao, 9, 2)) RETURN nComissao
Por lo tanto, si la condición lógica especificada en el comando IF se evalúa como verdadera (.T.), se ejecutará el bloque de instrucciones entre IF y ELSE, o entre IF y ENDIF, si ELSE no se especifica.
Si la condición se evalúa como falsa (.F.), el bloque de instrucciones entre ELSE y ENDIF se ejecutará. Si ELSE no se hubiera especificado, entonces ningún bloque de instrucciones se ejecutará.
Desvío múltiple
Dependiendo de determinadas condiciones, en algunas rutinas existe la necesidad de seleccionarse un único camino entre diversas alternativas para la continuación del flujo de ejecución. Los comandos DO CASE ... ENDCASE e IF ... ELSEIF ... ENDIF permiten la toma de decisión entre tres o más alternativas de procesamiento.
Por lo tanto, cuando la selección del camino que se seguido por el flujo de control involucra más de dos alternativas, es necesario el uso de la estructura de Desvío múltiple o "Caso". La selección se realiza dependiendo de la condición de cada alternativa. Solamente una de las alternativas, aquella que atienda primero su condición, se ejecutará. Observe el siguiente ejemplo:
// Función de cálculo del Impuesto de renta de persona física (IRPF) FUNCTION CalcIR(nSalario) LOCAL nDesconto := 0 DO CASE CASE nSalario > 5800 nDesconto := nSalario * 0.275 CASE nSalario >= 3400 nDesconto := nSalario * 0.15 CASE nSalario >= 2300 nDesconto := nSalario * 0.075 OTHERWISE cCondicao := "EXENTO" ENDCASE IF EMPTY(nDesconto) MSGALERT(cCondicao) ELSE MSGALERT("El descuento sobre el sueldo es de R$" + Str(nDesconto, 9, 2)) ENDIF RETURN nDesconto
La clausula OTHERWISE (de otra manera) es opcional y significa que se ejecutarán las instrucciones que se encuentren entre ésta y ENDCASE (final del CASE) si ninguna de las condiciones fuera satisfecha.
El comando IF ... ELSEIF ... ENDIF es una alternativa para la estructura de control de desvío múltiple, pues su funcionamiento es equivalente al del comando DO CASE ... CASE ... ENDCASE. El ejemplo anterior puede reconstruirse utilizándose el comando IF ... ELSEIF ... ENDIF de la siguiente forma:
// Función de cálculo del Impuesto de renta de persona física (IRPF) FUNCTION CalcIR(nSalario) FUNCTION CalcIR(nSalario) LOCAL nDesconto := 0 IF nSalario > 5800 nDesconto := nSalario * 0.275 ELSEIF nSalario >= 3400 nDesconto := nSalario * 0.15 ELSEIF nSalario >= 2300 nDesconto := nSalario * 0.075 ELSE cCondicao := "EXENTO" ENDIF IF EMPTY(nDesconto) MSGALERT(cCondicao) ELSE MSGALERT("El descuento sobre el sueldo es de R$ " + Str(nDesconto, 9, 2)) ENDIF RETURN nDesconto
La cláusula ELSE (si no) es opcional y significa que se ejecutarán las instrucciones que vengan entre esta y el ENDIF (final del desvío múltiple) si no satisfacen ninguna condición.