Sintaxe

 

WHILE <condição>

          ...

          < instruções >

          ...

 

          [ LOOP ]

          ...

          < instruções >

          ...

 

          [ EXIT ]

          ...

          < instruções >

          ...

ENDDO

 

Propósito

 

O WHILE é um comando de controle de fluxo de programação que permite que um bloco de instruções seja executado repetidamente enquanto uma determinada condição permanecer verdadeira. Este tipo de estrutura de programação é chamado de “loop” ou repetição.

 

Argumentos

 

<condição >

 

É uma expressão lógica para controlar a repetição do comando WHILE. A repetição termina quando a condição for avaliada como falsa (.F.).

 

EXIT

 

Finaliza incondicionalmente a repetição do WHILE, desviando o fluxo de execução para a primeira linha de instrução após o ENDDO.

 

LOOP

 

Desvia o fluxo de execução para o início do bloco de instruções WHILE ... ENDDO no qual estiver contido, fazendo com que a condição seja reavaliada.

 

Utilização

 

O comando WHILE deve ser utilizado sempre que for necessária a repetição de um bloco de instruções  por um determinado número de vezes, em geral desconhecido, enquanto uma condição especificada permanecer verdadeira.

 

A estrutura desse comando deve obrigatoriamente ser finalizada por um ENDDO.

 

A <condição> é o uma condição lógica para controlar o número de vezes que o bloco de instruções deverá ser repetido. Ela será avaliada cada vez que o WHILE for repetido. Se for verdadeira, as instruções entre o WHILE e o ENDDO serão executadas. Caso contrário, o fluxo de execução será desviado para a primeira linha de instrução após o ENDDO.

 

Qualquer outra estrutura de comando dentro de um WHILE, como outro WHILE ... ENDDO, um IF ... ENDIF, um DO CASE ... ENDCASE ou um FOR ... NEXT, deve ser corretamente intercalada. Isto é, deve iniciar e finalizar dentro do WHILE ... ENDDO principal. Não há limites para o número de comandos ou estruturas de controle do fluxo de programação que podem existir dentro de uma estrutura WHILE ... ENDDO.

 

A intercalação de vários comandos WHILE é possível, desde que cada um tenha o seu correspondente ENDDO e esteja contido sempre dentro do WHILE de maior nível. Por exemplo:

 

WHILE (nível 1)

 

          WHILE (nível 2)

 

                   WHILE (nível 3)

 

                   ENDDO (nível 3)

 

          ENDDO (nível 2)

 

ENDDO (nível 1)

 

O uso do operador macro ( & ) é permitido na condição do WHILE, mesmo de forma recursiva (mudando o nome da variável a ser substituída), ou em qualquer outro ponto do bloco de instruções contido no WHILE ... ENDDO.

 

O comando EXIT, se colocado dentro de um WHILE ... ENDDO, finaliza imediatamente a repetição e transfere o fluxo de execução para a primeira linha de instrução após o ENDDO.

 

O comando LOOP, se colocado dentro de um WHILE ... ENDDO, interrompe imediatamente a execução das instruções e retorna o fluxo de execução para o início do WHILE. Ou seja, reinicia uma nova repetição, inclusive reavaliando a condição de controle.

 

Dicas

 

A declaração WHILE <condição> abre a estrutura de repetição que processa os comandos subsequentes apenas enquanto a condição permanecer verdadeira. Esta condição deve ser uma expressão lógica, tal como os exemplos abaixo:

 

  • A == B
  • nVar1 < 100 .OR. nVar2 > 50
  • nVar3 <= 50 .AND. nVar3 >= 10
  • nVop == 1
  • cNome == “Cosentino”
  • !EOF()

 

Exemplos

 

O exemplo abaixo mostra a realização de um cálculo enquanto uma determinada condição for verdadeira. São utilizadas duas estruturas WHILE ... ENDDO, sendo que a de maior nível demonstra a leitura de um arquivo de dados:

 

// Função 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

 

 

O exemplo abaixo demonstra a típica utilização do comando LOOP:

 

WHILE <condição>

          ...

          <instruções iniciais>

          ...

 

          IF <condição específica>

                    LOOP

          ENDIF

 

          ...

          <instruções finais>

          ...

ENDDO

 

 

O exemplo abaixo demonstra a típica utilização do comando EXIT:

 

WHILE <condição>

          ...

          <instruções iniciais>

          ...

 

          IF <condição específica>

                    EXIT

          ENDIF

 

          ...

          <instruções finais>

          ...

ENDDO

 

  • Sem rótulos