Olá pessoal…
Na vídeo aula de hoje, vou falar um pouco sobre Laços de Repetição e Testes em AdvPL (While, For, If e Case).
Abaixo os links do TDN sobre o assunto:
DO CASE
IF … ELSEIF … ELSE … ENDIF
FOR … NEXT
WHILE … ENDDO
Abaixo o código fonte utilizado para os testes (zTestes.prw):
//Bibliotecas #Include "Protheus.ch" /*/{Protheus.doc} zTestes Exemplo de testes em AdvPL @author Atilio @since 08/11/2015 @version 1.0 @example u_zTestes() /*/ User Function zTestes() Local aArea := GetArea() Local dDataTst := Date() Local lQuinta := .F. //Testando se o dia de hoje é quinta feira If Upper(cDoW(dDataTst)) == "THURSDAY" lQuinta := .T. Alert("Hoje é Quinta!") //Senão mostra um alerta que hoje não é quinta Else lQuinta := .F. Alert("Hoje não é Quinta!") EndIf //Se não for quinta feira, e for sábado If !lQuinta .And. Upper(cDoW(dDataTst)) == "SATURDAY" Alert("Sábadão!") //Senão, se não for quinta feira, e for domingo ElseIf !lQuinta .And. Upper(cDoW(dDataTst)) == "SUNDAY" Alert("Domingão!") EndIf //Fazendo case de testes Do Case Case Upper(cDoW(dDataTst)) == "MONDAY" Alert("Hoje é <b>Segunda</b>") Case Upper(cDoW(dDataTst)) == "TUESDAY" Alert("Hoje é <b>Terça</b>") Case Upper(cDoW(dDataTst)) == "WEDNESDAY" Alert("Hoje é <b>Quarta</b>") Case Upper(cDoW(dDataTst)) == "THURSDAY" Alert("Hoje é <b>Quinta</b>") Case Upper(cDoW(dDataTst)) == "FRIDAY" Alert("Hoje é <b>Sexta</b>") Case Upper(cDoW(dDataTst)) == "SATURDAY" Alert("Hoje é <b>Sábado</b>") Case Upper(cDoW(dDataTst)) == "SUNDAY" Alert("Hoje é <b>Domingo</b>") OtherWise Alert("Hoje é <b>???</b>") EndCase RestArea(aArea) Return
Abaixo o código fonte utilizado para os testes (zLacos.prw):
//Bibliotecas #Include "Protheus.ch" /*/{Protheus.doc} zLacos Exemplo de laços de repetição em AdvPL @author Atilio @since 08/11/2015 @version 1.0 @example u_zLacos() /*/ User Function zLacos() Local aArea := GetArea() Local nValor:= 1 Local cNome := "" //Exemplo de For (Fazer do Valor de 1 Até 10) For nValor := 1 To 10 Next Alert("For (++): "+cValToChar(nValor)) //Exemplo de For Inverso (Fazer do Valor de 10 Até 1) For nValor := 10 To 1 Step -1 Next Alert("For (--): "+cValToChar(nValor)) //Exemplo de While (Faça Enquanto o valor for diferente de 10)... Também pode ser utilizado o Do While nValor := 1 While nValor != 10 nValor++ EndDo Alert("While: "+cValToChar(nValor)) //Exemplo do While composto (mais de 1 teste no laço de repetição) nValor := 1 While nValor != 10 .And. cNome != "Daniel" //Se chegar no meio do laço If nValor == 5 cNome := "Daniel" EndIf nValor++ EndDo Alert("While Composto: "+cValToChar(nValor)) //Exemplo de quebra de laço de repetição (Fazer do Valor de 1 Até 10 incrementando de 2 em 2) For nValor := 1 To 10 Step 2 //Se o valor for igual a 6, diminui um valor (será 5), e pula o laço If nValor == 6 nValor-- Loop EndIf //Se o valor for igual a 7, encerra o laço de repetição If nValor == 7 Exit EndIf Next Alert("For (Quebra): "+cValToChar(nValor)) RestArea(aArea) Return
Se quiser fazer o download desse código, acesse nosso GitHub pelo link github.com/dan-atilio/AdvPL (Exemplos > Vídeo Aulas > 006 – Laços e Testes > zOperadores.prw).
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Esse Loop ainda é usado? Num laço de repetição WHILE o que eu usaria por exemplo?
Bom dia Lucas, tudo joia?
Recentemente perguntaram algo parecido no nosso grupo do WhatsApp, segue a resposta que enviamos naquela ocasião:
[…]
Então, se você quiser dentro do laço fazer condições para pular e ir pro próximo, você pode sim usar o Loop. Ou se você quiser sair do laço de uma vez, você pode usar a Exit.
Pegando então um exemplo, supondo que você esteja fazendo um relatório, com um laço de repetição na SB1, e dentro dele, se o tipo do produto for PI, você quer pular para o próximo, você teria então que usar o DbSkip na tabela, e em seguida o loop, por exemplo:
//Percorre a SB1
While ! SB1->(EoF())
//Fazendo uma condição específica para pular no meio
If SB1->B1_TIPO == “PI”
SB1->(DbSkip())
Loop //Volta pra linha do While
EndIf
//Aqui você faz suas tratativas
SB1->(DbSkip())
EndDo
[…]
Um grande abraço.