Árvore de páginas

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

  • Sem rótulos