Usina BRGuía AdvPL
Ingresar
← Todos los temas
COMANDOPublicado

WHILE ... ENDDO

WHILE <expressão lógica> ... ENDDO

Repite un bloque de comandos mientras una expresión lógica permanezca verdadera.

RepeticiónControl de flujoComandos
01 · DESCRIPCIÓN GENERAL

Descripción general

WHILE ... ENDDO evalúa la condición antes de cada iteración. Si es verdadera (.T.), ejecuta el bloque; cuando es falsa (.F.), el procesamiento continúa después de ENDDO. EXIT termina inmediatamente el bucle y LOOP vuelve a WHILE, reevaluando la condición sin ejecutar el resto del bloque actual.

02 · SINTAXIS

Sintaxis

WHILE <expressão lógica> ... ENDDO

Parámetros

expressão lógica
LógicoObligatorio

Condición reevaluada antes de cada iteración. El bucle continúa solamente mientras devuelva .T.

comandos
Instruções AdvPLObligatorio

Instrucciones AdvPL ejecutadas en cada paso mientras la condición permanezca verdadera.

03 · EJEMPLO PRÁCTICO

Repetición controlada por condición

User Function ExWhilePares()
    Local nNumero := 0
    Local nSuma := 0

    While nNumero <= 100
        nSuma += nNumero
        nNumero += 2
    EndDo

    MsgInfo("Suma de pares: " + CValToChar(nSuma))
Return
Resultado esperado

La condición se comprueba antes de cada paso. nNumero avanza de dos en dos hasta superar 100.

04 · EJEMPLO PRÁCTICO

Lectura secuencial de una tabla

User Function ExWhileTabela()
    DbSelectArea("SA1")
    SA1->(DbGoTop())

    While !SA1->(Eof())
        ConOut(SA1->A1_COD + " - " + SA1->A1_NOME)
        SA1->(DbSkip())
    EndDo
Return
Resultado esperado

El bucle procesa cada registro hasta que EOF() indica el final del área. DbSkip() es indispensable para avanzar.

05 · EJEMPLO PRÁCTICO

LOOP y EXIT con actualización segura

User Function ExWhileControle()
    Local nItem := 0

    While nItem < 20
        nItem++

        If nItem % 2 != 0
            Loop
        EndIf

        If nItem > 10
            Exit
        EndIf

        ConOut(CValToChar(nItem))
    EndDo
Return
Resultado esperado

El contador se actualiza antes de LOOP. Se ignoran los valores impares y EXIT termina el bucle después del límite deseado.

BUENAS PRÁCTICAS
  • Utiliza WHILE cuando la cantidad de iteraciones dependa de una condición que cambia durante el procesamiento.
  • Garantiza que alguna instrucción del bloque pueda volver falsa la condición.
  • Utiliza EXIT para terminar antes después de encontrar el resultado deseado.
  • Utiliza LOOP para ignorar el resto de una iteración, pero actualiza primero las variables de control.
  • Al leer tablas, avanza con DbSkip() y combina EOF() con las demás condiciones necesarias.
ERRORES COMUNES
  • Una condición que nunca se vuelve falsa produce un bucle infinito.
  • LOOP puede saltar la actualización del contador, DbSkip() u otra instrucción necesaria para terminar el bucle.
  • Cada WHILE necesita su ENDDO correspondiente; las estructuras anidadas deben abrirse y cerrarse correctamente.
  • Las condiciones que acceden a campos o funciones deben seguir siendo válidas en todas las iteraciones.
  • Los bloques muy largos o con muchos niveles son más difíciles de probar y mantener.

Contenido relacionado

REFERENCIAS
  1. TOTVS. El comando WHILE...ENDDO. TDN. Creado por Rafaela Rocha Hikiji; última modificación el 17 de enero de 2022.
  2. TOTVS. WHILE ... ENDDO. Framework TDN.
  3. TOTVS. Desarrollo de queries en Protheus. TDN.
Estado
Publicado
Página creada el
Última revisión el
Idioma original
Portugués
Revisión
Usina.BR