Sintaxis
WHILE <condición>
...
< instrucciones >
...
[ LOOP ]
...
< instrucciones >
...
[ EXIT ]
...
< instrucciones >
...
ENDDO
Propósito
El WHILE es un comando de control de flujo de programación que permite que un bloque de instrucciones se ejecute repetidamente mientras una determinada condición permanezca verdadera. Este tipo de estructura de programación se llama “loop” o repetición.
Argumentos
<condición >
Es una expresión lógica para controlar la repetición del comando WHILE. La repetición termina si la condición se evalúa como falsa (.F.).
EXIT
Finaliza incondicionalmente la repetición del WHILE, desviando el flujo de ejecución a la primera línea de instrucción después del ENDDO.
LOOP
Desvía el flujo de ejecución al inicio del bloque de instrucciones WHILE ... ENDDO en el cual esté contenido, permitiendo que la condición sea reevaluada.
Utilización
El comando WHILE debe utilizarse siempre que sea necesaria la repetición de un bloque de instrucciones por un determinado número de veces, en general desconocido, mientras una condición especificada permanezca verdadera.
La estructura de este comando debe finalizarse obligatoriamente por un ENDDO.
La <condición> es una condición lógica para controlar el número de veces que debe repetirse el bloque de instrucciones. Este se evaluará cada vez que se repita el WHILE. Si es verdadera, las instrucciones entre el WHILE y el ENDDO se ejecutarán. En caso contrario, el flujo de ejecución se desviará a la primera línea de instrucción después del ENDDO.
Cualquier otra estructura de comando dentro de un WHILE, como otro WHILE ... ENDDO, un IF ... ENDIF, un DO CASE ... ENDCASE o un FOR ... NEXT, debe intercalarse correctamente. Es decir, debe iniciar y finalizar dentro del WHILE ... ENDDO principal. No hay límites para que el número de comandos o estructuras de control del flujo de programación puedan existir dentro de una estructura WHILE ... ENDDO.
La intercalación de varios comandos WHILE es posible, siempre y cuando cada uno tenga su correspondiente ENDDO y esté contenido siempre dentro del WHILE de mayor nivel. Por ejemplo:
WHILE (nivel 1)
WHILE (nivel 2)
WHILE (nivel 3)
ENDDO (nivel 3)
ENDDO (nivel 2)
ENDDO (nivel 1)
El uso del operador macro ( & ) está permitido en la condición del WHILE, incluso de forma recursiva (cambiando el nombre de la variable que se sustituirá), o en cualquier otro punto del bloque de instrucciones contenido en el WHILE ... ENDDO.
Al colocarse el comando EXIT dentro de un WHILE ... ENDDO, finaliza inmediatamente la repetición y transfiere el flujo de ejecución a la primera línea de instrucción después del ENDDO.
Al colocarse el comando LOOP dentro de un WHILE ... ENDDO, interrumpe inmediatamente la ejecución de las instrucciones y devuelve el flujo de ejecución al inicio del WHILE. Es decir, reinicia una nueva repetición, incluso reevaluando la condición de control.
Sugerencias
La declaración WHILE <condición> abre la estructura de repetición que procesa los comandos subsiguientes solamente mientras la condición permanezca verdadera. Esta condición debe ser una expresión lógica, tal como los siguientes ejemplos:
- A == B
- nVar1 < 100 .OR. nVar2 > 50
- nVar3 <= 50 .AND. nVar3 >= 10
- nVop == 1
- cNome == “Cosentino”
- !EOF()
Ejemplos
El siguiente ejemplo muestra la realización de un cálculo mientras una determinada condición es verdadera. Se utilizan dos estructuras WHILE ... ENDDO, siendo que la de mayor nivel muestra la lectura de un archivo de datos:
// Función de cálculo
FUNCTION CalcGrao(cFornec, cLoja, cProduto, nSacas, aAlmox)
LOCAL nPos := 0
LOCAL nReserva := 0
LOCAL nSoma := 0
SC6->(dbSetOrder(1))
SC6->(dbSeek(xFilial(“SA2”) + cFornec + cLoja + cProduto))
WHILE SC6->(FOUND()) .AND. SC6->C6_FILIAL == xFilial(“SC6”) .AND. SC6->C6_CLI == cFornec .AND. SC6->C6_LOJA == cLoja .AND. SC6->C6_COD == cProduto
WHILE nPos < LEN(aAlmox) .AND. nReserva < nSacas
nPos++
nSoma := nReserva + aAlmox[nPos]
IF nSoma <= nSacas
nReserva := nSoma
ELSE
nReserva := nSacas
ENDIF
ENDDO
SC6->(dbSkip())
ENDDO
RETURN nReserva
El siguiente ejemplo muestra la típica utilización del comando LOOP:
WHILE <condición>
...
<instrucciones iniciales>
...
IF <condición específica>
LOOP
ENDIF
...
<instrucciones finales>
...
ENDDO
El siguiente ejemplo muestra la típica utilización del comando EXIT:
WHILE <condición>
...
<instrucciones iniciales>
...
IF <condición específica>
EXIT
ENDIF
...
<instrucciones finales>
...
ENDDO