Estructuras condicionales
If...Else...End if
La sintaxis de la estructura condicional If...Else...End if es:
 If(Boolean_Expression)
    statement(s)
 Else
    statement(s)
 End if
Tenga en cuenta que la parte Else es opcional; puede escribir:
 If(Boolean_Expression)
    statement(s)
 End if
La estructura If...Else...End if permite a su método elegir entre dos acciones, dependiendo de si una prueba (una expresión booleana) es TRUE o FALSE. Cuando la expresión booleana es TRUE, se ejecutan las sentencias que siguen inmediatamente a la prueba. Si la expresión booleana es FALSE, se ejecutan las instrucciones que siguen a la línea Else. El Else es opcional; si se omite Else, la ejecución continúa con la primera instrucción (si la hay) que sigue al End if.
Tenga en cuenta que la expresión booleana siempre se evalúa completamente. Considere en particular la siguiente prueba:
 If(MethodA & MethodB)
    ...
 End if
la expresión es TRUE sólo si ambos métodos son TRUE. Sin embargo, incluso si MethodA devuelve FALSE, 4D seguirá evaluando MethodB, lo que supone una pérdida de tiempo inútil. En este caso, es más interesante utilizar una estructura como:
 If(MethodA)
    If(MethodB)
       ...
    End if
 End if
El resultado es similar y MethodB se evalúa sólo si es necesario.
Ejemplo
  // Ask the user to enter a name
 $Find:=Request(Type a name)
 If(OK=1)
    QUERY([People];[People]LastName=$Find)
 Else
    ALERT("You did not enter a name.")
 End if
 End if
Consejo: la ramificación puede realizarse sin que las instrucciones se ejecuten en un caso u otro. Al desarrollar un algoritmo o una aplicación especializada, nada le impide escribir:
 If(Boolean_Expression)
 Else
    statement(s)
 End if
o:
 If(Boolean_Expression)
    statement(s)
 Else
 End if
Case of... Else...End case
The formal syntax of the Case of... Else...End case control flow structure is:
 Case of
    :(Boolean_Expression)
       statement(s)
    :(Boolean_Expression)
       statement(s)
       .
       .
       .
    :(Boolean_Expression)
       statement(s)
    Else
       statement(s)
 End case
Tenga en cuenta que la parte Else es opcional; puede escribir:
 Case of
    :(Boolean_Expression)
       statement(s)
    :(Boolean_Expression)
       statement(s)
       .
       .
       .
    :(Boolean_Expression)
       statement(s)
 End case
As with the If...Else...End if structure, the Case of... Else...End case structure also lets your method choose between alternative actions. Unlike the If...Else...End if structure, the Case of... Else...End case structure can test a reasonable unlimited number of Boolean expressions and take action depending on which one is TRUE.
Cada expresión booleana va precedida de dos puntos (:). Esta combinación de los dos puntos y la expresión booleana se llama un caso. Por ejemplo, la siguiente línea es un caso:
:(bValidate=1)
Sólo se ejecutarán las instrucciones que sigan al primer caso TRUE (y hasta el siguiente). Si ninguno de los casos es TRUE, no se ejecutará ninguna de las instrucciones (si no se incluye la parte Else).
Puede incluir una instrucción Else después del último caso. Si todos los casos son FALSE, se ejecutarán las instrucciones siguientes al Else.
Ejemplo
Este ejemplo comprueba una variable numérica y muestra un cuadro de alerta con una palabra:
 Case of
    :((vResult=1) & (vCondition#2)) //this case will be detected first
       ... //statement(s)
    :(vResult=1)
       ... //Si es 1, mostrar una alerta
    :(vResult=2) //Probar si el número es 2
       ALERT("Two.") Case of
    :(vResult=1) //Probar si el número es 1
       ALERT("One.") //Si es 1, mostrar una alerta
    :(vResult=2) //Probar si el número es 2
       ALERT("Two.") //Si es 2, mostrar una alerta
    :(vResult=3) //Probar si el número es 3
       ALERT("Three.") //Si es 3, mostrar una alerta
    Else //Si no es 1, 2 o 3, mostrar una alerta
       ALERT("It was not one, two, or three.")
 //statement(s)
 End case //Si es 3, mostrar una alerta
    Else //Si no es 1, 2 o 3, mostrar una alerta
       ALERT("It was not one, two, or three.")
 //statement(s)
 End case
Para comparar, aquí está la versión If...Else...End if del mismo método:
 If(vResult=1) //Probar si el número es 1
    ALERT("One.") If(vResult=1) //Probar si el número es 1
    ALERT("One.") If(vResult=1) //Probar si el número es 1
    ALERT("One.") //Si es 1, mostrar una alerta
 Else
    If(vResult=2) //Probar si el número es 2
       ALERT("Two.") //Si es 2, mostrar una alerta
    Else
       If(vResult=3) //Probar si el número es 3
          ALERT("Three.") //Si es 3, mostrar una alerta
    Else //Si no es 1, 2 o 3, mostrar una alerta
       ALERT("It was not one, two, or three.")
       End if
    End if
 End if //Si es 2, mostrar una alerta
    Else
       If(vResult=3) //Probar si el número es 3
          ALERT("Three.") //Si es 3, mostrar una alerta
    Else //Si no es 1, 2 o 3, mostrar una alerta
       ALERT("It was not one, two, or three.")
       End if
    End if
 End if //Si es 2, mostrar una alerta
    Else
       If(vResult=3) //Probar si el número es 3
          ALERT("Three.") //Si es 3, mostrar una alerta
    Else //Si no es 1, 2 o 3, mostrar una alerta
       ALERT("It was not one, two, or three.")
       End if
    End if
 End if
Remember that with a Case of... Else...End case structure, only the first TRUE case is executed. Aunque dos o más casos sean TRUE, sólo se ejecutarán las instrucciones que siguen al primer caso TRUE.
En consecuencia, cuando quiera implementar pruebas jerárquicas, debe asegurarse de que las declaraciones de condición que están más abajo en el esquema jerárquico aparezcan primero en la secuencia de pruebas. Por ejemplo, si se quiere procesar el caso simple (vResult=1) y el caso complejo (vResult=1) & (vCondition#2) y se estructura el método de la siguiente manera: Por ejemplo, el siguiente código nunca verá detectada su última condición:
 Case of
    :(vResult=1) //Test if the number is 1
       ALERT("One.") //If it is 1, display an alert
    :(vResult=2) //Test if the number is 2
       ALERT("Two.") //If it is 2, display an alert
    :(vResult=3) //Test if the number is 3
       ALERT("Three.") //If it is 3, display an alert
    Else //If it is not 1, 2, or 3, display an alert
       ALERT("It was not one, two, or three.")
 End case
En el código anterior, la presencia de la segunda condición no se detecta, ya que la prueba "vResult=1" ramifica el código antes de cualquier otra prueba. Para que el código funcione correctamente, puedes escribirlo así:
 If(vResult=1) //Test if the number is 1
    ALERT("One.") //If it is 1, display an alert
 Else
    If(vResult=2) //Test if the number is 2
       ALERT("Two.") //If it is 2, display an alert
    Else
       If(vResult=3) //Test if the number is 3
          ALERT("Three.") //If it is 3, display an alert
       Else //If it is not 1, 2, or 3, display an alert
          ALERT("It was not one, two, or three.")
       End if
    End if
 End if
Además, si quiere implementar pruebas jerárquicas, puede considerar el uso de código jerárquico.
Consejo: la ramificación puede realizarse sin que las instrucciones se ejecuten en un caso u otro. Al desarrollar un algoritmo o una aplicación especializada, nada le impide escribir:
 Case of
    :(Boolean_Expression)
    :(Boolean_Expression)
      ...
    :(Boolean_Expression)
       statement(s)
    Else
       statement(s)
 End case
o:
 Case of
    :(Boolean_Expression)
    :(Boolean_Expression)
       statement(s)
       ...
    :(Boolean_Expression)
       statement(s)
    Else
 End case
o:
 Case of
    Else
       statement(s)
 End case