Usina BRAdvPL Guia
Entrar
← Todos os tópicos
COMANDOPublicado

WHILE ... ENDDO

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

Repete um bloco de comandos enquanto uma expressão lógica permanecer verdadeira.

RepetiçãoControle de fluxoComandos
01 · VISÃO GERAL

Visão geral

A estrutura WHILE ... ENDDO avalia a condição antes de cada iteração. Se o resultado for verdadeiro (.T.), o bloco é executado; quando for falso (.F.), o processamento continua após ENDDO. EXIT encerra imediatamente o laço e LOOP retorna ao WHILE, reavaliando a condição sem executar o restante do bloco atual.

02 · SINTAXE

Sintaxe

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

Parâmetros

expressão lógica
LógicoObrigatório

Condição reavaliada antes de cada iteração. O laço continua somente enquanto seu resultado for .T.

comandos
Instruções AdvPLObrigatório

Instruções executadas em cada passagem enquanto a condição permanecer verdadeira.

03 · EXEMPLO PRÁTICO

Repetição controlada por condição

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

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

    MsgInfo("Soma dos pares: " + CValToChar(nSoma))
Return
Resultado esperado

A condição é verificada antes de cada passagem. nNumero avança de dois em dois até ultrapassar 100.

04 · EXEMPLO PRÁTICO

Leitura sequencial de uma tabela

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

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

O laço processa cada registro até EOF() indicar o fim da área. DbSkip() é indispensável para avançar.

05 · EXEMPLO PRÁTICO

LOOP e EXIT com atualização 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

O contador é atualizado antes de LOOP. Valores ímpares são ignorados e EXIT encerra o laço após o limite desejado.

BOAS PRÁTICAS
  • Use WHILE quando a quantidade de repetições depender de uma condição que muda durante o processamento.
  • Garanta que alguma instrução do bloco possa tornar a condição falsa.
  • Use EXIT para encerrar antecipadamente o laço após encontrar o resultado desejado.
  • Use LOOP para ignorar o restante da iteração, mas atualize antes as variáveis que controlam a condição.
  • Em leituras de tabelas, avance o registro com DbSkip() e combine EOF() com as demais condições necessárias.
ARMADILHAS COMUNS
  • Uma condição que nunca se torna falsa produz um laço infinito.
  • LOOP pode saltar a atualização do contador, DbSkip() ou outra instrução necessária para encerrar o laço.
  • Cada WHILE precisa de seu ENDDO correspondente; estruturas aninhadas devem ser abertas e fechadas corretamente.
  • Condições com acesso a campos ou funções devem continuar válidas durante todas as iterações.
  • Blocos muito extensos ou com muitos níveis de aninhamento dificultam testes e manutenção.

Conteúdos relacionados

REFERÊNCIAS
  1. TOTVS. O Comando WHILE...ENDDO. TDN. Criado por Rafaela Rocha Hikiji; última alteração em 17 jan. 2022.
  2. TOTVS. WHILE ... ENDDO. Framework TDN.
  3. TOTVS. Desenvolvendo queries no Protheus. TDN.
Situação
Publicado
Página criada em
Última revisão em
Idioma original
Português
Revisão
Usina.BR