Vídeo Aula – AdvPL 006 – Laços de Repetição e Testes

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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

2 Responses

  1. Lucas disse:

    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.

Deixe uma resposta

Terminal de Informação