4D v17.4

For each...End for each

Página Inicial

 
4D v17.4
For each...End for each

For each...End for each  


 

 

A sintaxe formal da estrutura repetitiva ou loop For each...End for each é a seguinte:

 For each(Current_Item;Expression{;begin{;end}}){Until|While}(Boolean_Expression)}
 statement(s)
End for each

A estrutura For each...End for each executa o ciclo de instruções definidas para cada Elemento_atual de Expressão.  O tipo Elemento_atual depende do tipo de Expressão. O loop For each...End for each pode iterar através de três tipos de Expressão:

  • coleções: loop através de cada elemento da coleção,
  • seleções de entidade: loop através de cada entidade
  • objetos: loop através de cada propriedade do objeto.

A tabela abaixo compara os três tipos de For each...End for each:

Loop em coleçõesLoop em seleção de entidadeLoop em objetos
Tipo Current_ItemVariável do mesmo tipo que os elementos da coleçãoEntityVariável texto
Tipo ExpresssãoColeção (com elementos do mesmo tipo) Seleção de entidadeObjeto
Número de loops (padrão)Número de elementos da coleçãoNúmero de entidades na seleçãoNúmero de propriedades de objetos
Suporte de Parâmetros begin / endSimSimNão
  • O número de loops é avaliado no início e não muda durante o processamento. Geralmente não é recomendado agregar ou eliminar elementos durante o ciclo, já que pode dar como resultado iterações faltantes ou redundantes.
  • Como padrão, as instruções adjuntas são executadas para cada valor em Expressão. Entretanto, é possível sair do loop testando uma condição  seja no começo do loop (While) ou ao final do loop (Until).
  • Os parâmetros opcionais inicio e fim podem ser usados com coleções e seleções de entidades para definir os limites do loop.

Quando For each...End for each for usada com uma Expressão de tipo Collection, o parâmetro Elemento_atual é uma variável do mesmo tipo que os elementos da coleção. Como padrão o número de loops se baseia na quantidade de elementos da coleção.

A coleção deve conter apenas elementos do mesmo tipo; do contrário, se devolverá um erro logo que à varável Elemento_atual tiver sido atribuida o primeiro valor de tipo diferente.

Em cada iteração de loop, a variável Elemento_atual é preenchida automaticamente com o elemento coincidente da coleção. Os pontos abaixo devem levados em consideração:

  • Se a variável Elemento_atual for de tipo objeto ou coleção (ou seja, se Expressão é uma coleção de objetos ou de coleções), modificar esta variável modificará automaticamente o elemento correspondente da coleção (porque os objetos e as coleções compartem as mesmas referências). Se a variável for de tipo escalar, apenas se modificará a varável.
  • A varável Elemento_atual deve ser do mesmo tipo que os elementos da coleção. Se algum elemento da coleção não for do mesmo tipo que a variável, é gerado um erro e o ciclo para.
  • Se a coleção contiver elementos com um valor Null, se gerará um erro se o tipo de varável Elemento_atual não admitir valores Null (como as variáveis inteiro longo).
Exemplo  

Se quiser calcular algumas estatísticas para uma coleção de números:

 C_COLLECTION($nums)
 $nums:=New collection(10;5001;6665;33;1;42;7850)
 C_LONGINT($item;$vEven;$vOdd;$vUnder;$vOver)
 For each($item;$nums)
    If($item%2=0)
       $vEven:=$vEven+1
    Else
       $vOdd:=$vOdd+1
    End if
    Case of
       :($item<5000)
          $vUnder:=$vUnder+1
       :($item>6000)
          $vOver:=$vOver+1
    End case
 End for each
  //$vEven=3, $vOdd=4
  //$vUnder=4,$vOver=2

Quando For each...End for each for usado com uma Expressão do tipo Entity selection, o parâmetro Current_Item é a entidade que está atualmente sendo processada.

O número de loops é baseado no número de entidades na seleção de entidades. Em cada iteração de loop, o parâmetro Current_Item é automaticamente preenchida com a entidade da seleção de entidade que for processada atualmente.

Nota: Se a seleção de entidade conter uma entidade que foi removida enquanto isso por outro processo, é automatiamente saltada durante o loop

Lembre que qualquer modificação aplicada a entidade atual deve ser salva explicitamente usando entity.save( ).

Exemplo  

Se quiser aumentar o salário de todos os funcionários britânicos em uma seleção de entidade

 C_OBJECT(emp)
 For each(emp;ds.Employees.query("country='UK'"))
    emp.salary:=emp.salary*1,03
    emp.save()
 End for each

Quando For each...End for each for usado com uma Expressão do tipo Objeto, o parâmetro Current_Item é uma variável de texto automaticamente preenchida com o nome da propriedade atualmente processada

As propriedades do objeto são processadas de acordo com sua ordem de criação. Durante o loop, as propriedades podem ser adicionadas ou removidas do objeto, sem modificar o número de loops que ainda permanecem baseados no número original de propriedades do objeto

Exemplo  

Se quiser trocar os nomes para maiúsculas no objeto abaixo:

{
    "firstname": "gregory",
    "lastname": "badikora",
    "age": 20
}

É possível escrever:

 For each(property;vObject)
    If(Value type(vObject[property])=Is text)
       vObject[property]:=Uppercase(vObject[property])
    End if
 End for each

{
    "firstname": "GREGORY",
    "lastname": "BADIKORA",
    "age": 20
}

É possível definir limites à iteração usando os parâmetros opcionais inicio e fim.

Nota: Os parâmetros início e fim podem ser usados em iterações através de coleções e seleções de entidade (são ignorados em propriedades de objeto).

  • no parâmetro início, passe a posição do elemento em Expressão na qual vai iniciar a iteração (início é incluido)
  • No parâmetro fim, pode também passar a posição do elmento em  Expressão na qual vai iniciar a iteração (fim é excluído). 

Se fim for omitido ou se fim for maior que o número de elementos em Expressão, são iteragidos de inicio até o último elemento (incluído).

Se os parâmetros inicio e fim são valores positivos, representam posições reais dos elementos em Expressão.

Se inicio for um valor negativo, é recalculado como  inicio:=inicio+tamanho Expressão (é considerada como sendo o deslocamento do final de  Expressão). Se o valor calculado for negativo, inicio é estabelecido em 0.
Nota: Mesmo se início for negativo, a iteração é realizada mesmo assim na ordem padrão.
se end for um valor negativo, é recalculada como  fim:=fim+tamanho Expressão

Por exemplo:

  • uma colleção contém 10 elementos (numerados de 0 a 9)
  • inicio=-4 -> inicio=-4+10=6 -> iteração começa no sexto elemento (#5)
  • fim=-2 -> fim=-2+10=8 -> iteração para antes do oitavo elemento (#7), ou seja, no sétimo elemento.
Example  

 C_COLLECTION($col;$col2)
 $col:=New collection("a";"b";"c";"d";"e")
 $col2:=New collection(1;2;3)
 C_TEXT($item)
 For each($item;$col;0;3)
    $col2.push($item)
 End for each
  //$col2=[1,2,3,"a","b","c"]
 For each($item;$col;-2;-1)
    $col2.push($item)
 End for each
  //$col2=[1,2,3,"a","b","c","d"]

É possível controlar a execução  For each...End for each adicionando uma condição Until ou While ao loop. Quando uma declaração Until(condção ou While(conditção) estiver associada ao loop, a iteração vai parar logo que  conditção for avaliada como true.

É possível passar qualquer uma das palavras chaves dependendo de suas necessidades:

  • A condição Until é testada no final de cada iteração, então se Expressão não for vazia ou nula, o loop será executado pelo menos uma vez.
  • A condição While é testada no começo de cada iteração, então dependendo do resultado da condição, o loop às vezes nunca será executado.
Exemplo  

 $colNum:=New collection(1;2;3;4;5;6;7;8;9;10)
 
 $total:=0
 For each($num;$colNum)While($total<30) //testado ao início
    $total:=$total+$num
 End for each
 ALERT(String($total)) //$total = 36 (1+2+3+4+5+6+7+8)
 
 $total:=1000
 For each($num;$colNum)Until($total>30) //tested at the end
    $total:=$total+$num
 End for each
 ALERT(String($total)) //$total = 1001 (1000+1)

O loop For each...End for each pode ser usado em uma coleção partilhada ou um objeto partilhado.

Se seu código precisar modificar um ou mais elementos da coleção ou propriedades de objeto, é necessário usar as palavras chaves Use...End use. Dependendo de suas necessidades, pode chamar as palavras chaves Use...End use:

  • antes de entrar o loop, se itens precisarems ser modificados juntos por razões de integridade ou
  • dentro do loop quando apenas alguns elementos/propriedades precisam ser modificadas e não há problemas de integridade.

 
PROPRIEDADES 

Produto: 4D
Tema: Apresentação da linguagem

 
CONTEÚDO DA PÁGINA 
 
HISTÓRIA 

New
Criado por: 4D v17

 
ARTICLE USAGE

Manual de linguagem 4D ( 4D v17)
Manual de linguagem 4D ( 4D v17.1)
Manual de linguagem 4D ( 4D v17.2)
Manual de linguagem 4D ( 4D v17.3)
Manual de linguagem 4D ( 4D v17.4)