4D v18For each...End for each |
||||||||||||||||||||||
|
4D v18
For each...End for each
|
Loop em coleções | Loop em seleção de entidade | Loop em objetos | |
Tipo Current_Item | Variável do mesmo tipo que os elementos da coleção | Entity | Variável texto |
Tipo Expresssão | Coleção (com elementos do mesmo tipo) | Seleção de entidade | Objeto |
Número de loops (padrão) | Número de elementos da coleção | Número de entidades na seleção | Número de propriedades de objetos |
Suporte de Parâmetros begin / end | Sim | Sim | Não |
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 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( ).
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
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).
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:
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:
$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:
Produto: 4D
Tema: Apresentação da linguagem
Criado por: 4D v17
Manual de linguagem 4D ( 4D v18)