Comando FOR EACH...IN...NEXT

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Paulo_CPV
Usuário Nível 3
Usuário Nível 3
Mensagens: 178
Registrado em: 07 Mar 2013 10:27
Localização: Jacarei/SP

Comando FOR EACH...IN...NEXT

Mensagem por Paulo_CPV »

Boa tarde!

Eu gostaria de saber como usa o comando FOR EACH ... IN ... NEXT. Não estou entendendo a sintexe do comando. Se alguém me poder ajudar ficarei grato. E qual a diferença entre este comando e o FOR...TO...NEXT.

Abraços,

Paulo
Jacareí/SP
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Comando FOR EACH...IN...NEXT

Mensagem por Vlademiro »

Você pode encontrar nessa documentação (ítem 3.2)

http://www.kresin.ru/en/hrbfaq_3.html#Doc2

E nesse também :

https://vivaclipper.wordpress.com/2012/ ... next-loop/

Basicamente o FOR EACH percorre cada ítem de um elemento. Esse elemento pode ser uma string, um array ou um hash.
Paulo_CPV
Usuário Nível 3
Usuário Nível 3
Mensagens: 178
Registrado em: 07 Mar 2013 10:27
Localização: Jacarei/SP

Comando FOR EACH...IN...NEXT

Mensagem por Paulo_CPV »

Boa noite! Como eu converto o seguinte FOR ... TO ... NEXT para FOR EACH ... IN ... nesta parte do meu sistema.

Código: Selecionar todos

   cPeso    := "3298765432"
   cParte   := SUBSTR( cCpf , 1 , 10 )
   nParcial := 0
   nResult2 := 0
   
*------------------------------- Calculo do digito
   FOR x = 1 TO 10

      nParcial += ( VAL ( SUBSTR( cParte , x , 1 ) ) * VAL( SUBSTR ( cPeso , x , 1 ) ) )	  
   
   NEXT x
Quem puder me ajudar ficarei muito grato.

Atenciosamente,

Paulo Takami
Jacareí/SP
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Comando FOR EACH...IN...NEXT

Mensagem por JoséQuintas »

imagine o seguinte: para cada elemento do array, fazer determinada operação.

Usuários do fórum:

Código: Selecionar todos

aForumPCToledo := { "TOLEDO", "JOSE QUINTAS", "ASIMOES", "PAULO_CPV", "VLADEMIRO" }
Com FOR/NEXT

Código: Selecionar todos

FOR nCont = 1 TO Len( aForumPCToledo )
   ? aForumPCToledo[ nCont ]
NEXT
Com FOR/EACH, atenção que pode obrigar a declarar a variável pra poder funcionar:

Código: Selecionar todos

LOCAL oElement

FOR EACH oElement IN aForumPCToledo
   ? oElement
NEXT
Pode usar um nome mais adequado ao elemento também, e poderia usar direto o array:

Código: Selecionar todos

LOCAL oUsuario

FOR EACH oUsuario IN { "TOLEDO", "JOSE QUINTAS", "ASIMOES", "PAULO_CPV", "VLADEMIRO" }
   ? oUsuario
NEXT
Se for usado sobre uma string, cada elemento é uma letra da string.

Código: Selecionar todos

FOR EACH cLetra IN "TESTE DO FOR EACH"
   ? cLetra
NEXT
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Comando FOR EACH...IN...NEXT

Mensagem por JoséQuintas »

No seu loop vai precisar de algo mais "avançado", digamos assim, porque precisa saber o número do elemento atual:

Código: Selecionar todos

cPeso  := "3298765432"
// cParte := SUBSTR( cCpf , 1 , 10 )
 nParcial := 0
 nResult2 := 0
 
FOR EACH oElement IN Substr( cCpf, 1, 10 )

   nParcial += VAL ( oElement ) * VAL( SUBSTR ( cPeso , oElement:__EnumIndex , 1 ) ) )  
 
 NEXT
Tem outro uso do FOR/EACH mas não entendi, não sei se aplicaria no seu caso, usando duas variáveis de uma vez.

Código: Selecionar todos

FOR EACH a, b IN x, y
NEXT
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Comando FOR EACH...IN...NEXT

Mensagem por JoséQuintas »

Aplica sim:

Código: Selecionar todos

PROCEDURE Main

   LOCAL A, B

   FOR EACH A, B IN "123456", "abcdef"
      ? a, b
   NEXT

   RETURN

Código: Selecionar todos

1 a
2 b
3 c
4 d
5 e
6 f
Então:

Código: Selecionar todos

PROCEDURE Main

   LOCAL A, B, cCpf := "11122233344", cFator := "3298765432", nParcial := 0


   FOR EACH A, B IN cCpf, cFator
      nParcial += Val( a ) * Val( b )
   NEXT
   ? nParcial

   RETURN
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Comando FOR EACH...IN...NEXT

Mensagem por fladimir »

Eita... sempre aprendendo... esta da String não sabia.

Vlw
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Comando FOR EACH...IN...NEXT

Mensagem por JoséQuintas »

Tem mais um uso, pra trocar a string original, a string precisa ser por referência:

Código: Selecionar todos

PROCEDURE Main

   LOCAL cString := "ABCDEFGHIJKLMNOPQ", cLetra

   FOR EACH cLetra IN @cString
      IF cLetra $ "BDEF"
         cLetra := Lower( cLetra )
      ENDIF
   NEXT
   ? cString

   RETURN

Código: Selecionar todos

AbCdefGHIJKLMNOPQ
Nota: Array não precisa, porque por default já é por referência
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Paulo_CPV
Usuário Nível 3
Usuário Nível 3
Mensagens: 178
Registrado em: 07 Mar 2013 10:27
Localização: Jacarei/SP

Comando FOR EACH...IN...NEXT

Mensagem por Paulo_CPV »

Boa tarde! Obrigado por todos me darem ajuda sobre o assunto, mas gostaria se vocês tem mais exemplos do comando para me passar e qual é a sintaxe dele: o que eu coloco na FOR EACH <tipo conteúdo> IN <tipo de conteúdo>.

Abraços,

Paulo - Jacareí/SP
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Comando FOR EACH...IN...NEXT

Mensagem por JoséQuintas »

Tem todos os exemplos aí.
Talvez mais simples se pensar nisso em português:

Código: Selecionar todos

PARA CADA elemento DENTRO_DE      lista
   ? elemento
PROXIMO

Código: Selecionar todos

FOR EACH oElement IN lista
   ? oElement
NEXT
o que está em minúsculo, pode usar o nome que quiser/precisar.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Comando FOR EACH...IN...NEXT

Mensagem por asimoes »

Muito bom Quintas, excelente recurso.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
wmanesco
Usuário Nível 3
Usuário Nível 3
Mensagens: 116
Registrado em: 09 Set 2016 13:18
Localização: ITAJAI - SC

Comando FOR EACH...IN...NEXT

Mensagem por wmanesco »

Acho interessante ressaltar o uso em hash que acho bem bacana também:

Código: Selecionar todos

PROCEDURE Teste()

   LOCAL hTeste := HB_Hash()
   LOCAL element

   hTeste["a"] := 1
   hTeste["b"] := 2

   FOR EACH element IN hTeste 
      ? element                          // valor do componente, neste caso 1 e 2
      ? element:__enumKey()     //neste caso é apresentado a chave da hash, neste caso "a" e "b"
   NEXT



RETURN
William Manesco
Harbour 3.x | Fivewin | BCC | MySQL (TDolphin) | HBQT | HBIDE | Atom
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Comando FOR EACH...IN...NEXT

Mensagem por JoséQuintas »

Olhem este:

Código: Selecionar todos

cDest := XmlNode( cDest, "enderDest" )
::aDest[ "xLgr" ]    := XmlNode( cDest, "xLgr" )
::aDest[ "nro" ]     := XmlNode( cDest, "nro" )
::aDest[ "xCpl" ]    := XmlNode( cDest, "xCpl" )
::aDest[ "xBairro" ] := XmlNode( cDest, "xBairro" )
::aDest[ "cMun" ]    := XmlNode( cDest, "cMun" )
::aDest[ "xMun" ]    := XmlNode( cDest, "xMun" )
::aDest[ "UF" ]      := XmlNode( cDest, "UF" )
::aDest[ "CEP" ]     := XmlNode( cDest, "CEP" )
::aDest[ "cPais" ]   := XmlNode( cDest, "cPais" )
::aDest[ "xPais" ]   := XmlNode( cDest, "xPais" )

Código: Selecionar todos

cDest := XmlNode( cDest, "enderDest" )
FOR EACH oElement IN { "xLgr", "nro", "xCpl", "xBairro", "cMun", "xMun", "UF", "CEP", "cPais", "xPais" }
   ::aDest[ oElement ] := XmlNode( cDest, oElement )
NEXT
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Comando FOR EACH...IN...NEXT

Mensagem por asimoes »

Quintas,

Esse seu último post foi usando hb_hash()?
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Comando FOR EACH...IN...NEXT

Mensagem por JoséQuintas »

Sim, é que é parte de um fonte da hbnfe.
::aDest também é variável de uma classe.
Tem lá na classe

Código: Selecionar todos

::aDest := hb_Hash()
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder