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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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