Página 1 de 2

Comando FOR EACH...IN...NEXT

Enviado: 20 Set 2016 14:00
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

Comando FOR EACH...IN...NEXT

Enviado: 20 Set 2016 15:57
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.

Comando FOR EACH...IN...NEXT

Enviado: 20 Set 2016 21:11
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

Comando FOR EACH...IN...NEXT

Enviado: 20 Set 2016 21:49
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

Comando FOR EACH...IN...NEXT

Enviado: 20 Set 2016 21:54
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

Comando FOR EACH...IN...NEXT

Enviado: 20 Set 2016 22:01
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

Comando FOR EACH...IN...NEXT

Enviado: 20 Set 2016 22:37
por fladimir
Eita... sempre aprendendo... esta da String não sabia.

Vlw

Comando FOR EACH...IN...NEXT

Enviado: 21 Set 2016 00:23
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

Comando FOR EACH...IN...NEXT

Enviado: 22 Set 2016 16:48
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

Comando FOR EACH...IN...NEXT

Enviado: 22 Set 2016 17:03
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.

Comando FOR EACH...IN...NEXT

Enviado: 23 Set 2016 09:49
por asimoes
Muito bom Quintas, excelente recurso.

Comando FOR EACH...IN...NEXT

Enviado: 23 Set 2016 22:13
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

Comando FOR EACH...IN...NEXT

Enviado: 25 Set 2016 00:02
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

Comando FOR EACH...IN...NEXT

Enviado: 25 Set 2016 11:38
por asimoes
Quintas,

Esse seu último post foi usando hb_hash()?

Comando FOR EACH...IN...NEXT

Enviado: 25 Set 2016 13:11
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()