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.