他の多くのプログラミング言語と同様に、4Dでは、数値の反復処理を行うために For(…) / End for 文による数値の反復処理や、条件付きで While(…)/End whileと Repeat/Until(…)キーワードによって、数値の反復処理を行うことができます。これらの反復処理(またはループ)は非常に便利ですが、コレクションやエンティティセレクションのような高度なデータ型に対する反復処理には最も適切な方法ではありません。そのため、新しい For each(…)/End for each イテレータが作成され、コーディングが容易になりました!
コレクションアイテムのループ THROUGH
この For each / End for eachステートメントは、いくつかのケースで使用することができます。ひとつは、コレクション内の項目を ループするケースです。ループに入る前に、コレクションに属するアイテムの 数を事前に知っておく必要はありません。各繰り返しにおいて、最初のパラメータとして渡された変数(item) には、コレクションの現在のアイテム(col) が格納されます。
col
End for each:=New collection("charlie"; "delta"; "uniform"; "foxtrot"; "quebec")
$count :=0
For each (item;col)
If (Length(item)>5)$count:=$count+1
End if
ALERT (String($count)+" ワードを発見 !")
エンティティのループ処理
2つ目のケースは、最も新しいもので、エンティティセレクションの エンティティを ループするものです。エンティティやエンティティセレクションは、4Dの新しいコンセプトの一部で、このブログ記事で紹介しています。エンティティは レコードと似ていて、エンティティセレクションは従来の セレクションと比較することができますが、どちらもオブジェクトとして宣言されている、ということが主な内容です!
繰り返しますが、ループに入る前にエンティティ選択に属するエンティティの数についての予備知識は必要ありません。繰り返しのたびに、最初のパラメータとして渡されたエンティティ変数に、エンティティ選択の現在のエンティティが自動的に代入されます。
UK_emps:=ds.Employees.query("country='UK')
// Browse the entity selection
For each (emp;UK_emps)
emp. salary :=emp.salary*1.03// raise the salary
emp ...save() // save the result
End for each
オブジェクトのプロパティをループする
この For each / End for eachステートメントは、オブジェクトのプロパティをループする場合にも使うことができる。例えば、オブジェクトのプロパティ名を事前に知らなくても、汎用的なコードを書きたい場合に非常に有効です。
繰り返しになりますが、ループに入る前に、オブジェクトが いくつの プロパティを持っているかを事前に知っておく必要はありません。すべてのプロパティの名前が一つずつ解析されます。各繰り返しにおいて、最初のパラメータとして渡された変数( 以下の例ではproperty ) は、オブジェクトの属性名(以下の例では$contact) で埋め尽くされます。
For each ( ; ) ( ( )= ) := ( ) $property$contact
IfValue type$contact[$property]Is text
//Change to uppercase each attribute which is a text
$contact[$property]Uppercase$contact[$property]
End if
End for each