ループ、ループ、そして……さらにループ!

Deeplからの自動翻訳

他の多くのプログラミング言語と同様に、4Dでは、数値の反復処理を行うために For(…) / End for 文による数値の反復処理や、条件付きで While(…)/End whileRepeat/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

Roland Lannuzel
- プロダクトオーナー&4Dエキスパート -電子工学を学んだ後、産業用ITの分野で開発者兼コンサルタントとして、さまざまなデータベースやテクノロジーを使って顧客のためのソリューションを構築。80年代後半に4Dに惚れ込み、会計、請求書作成、メールシステムなどのビジネスアプリケーションの作成に4Dを使用してきました。現在も、新機能やデータベース開発ツールの定義など、4Dの未来を積極的に切り開いています。