EntitySelection
エンティティセレクションとは、同じ データクラス に所属する一つ以上の エンティティ への参照を格納しているオブジェクトのことです。 エンティティセレクションは、データクラスから 0個、1個、あるいは X個のエンティティを格納することができます (X はデータクラスに格納されているエンティティの総数です)。
.all()
、.query()
などの DataClass
クラス の関数や、.and()
、orderBy()
など EntitySelection
クラス自身の関数を用いて、既存のセレクションからエンティティセレクションを作成することができます 。 また、dataClass.newSelection()
関数または Create entity selection
コマンドを使用して、空のエンティティセレクションを作成することもできます。
概要
[index]
履歴
リリース | 内容 |
---|---|
17 | 追加 |
[index] : 4D.Entity
説明
EntitySelection[index]
記法を使用すると、標準のコレクションシンタックスを使用してエンティティセレクション内のエンティティにアクセスすることができます。取得したいエンティティの位置を index に渡します。
対応するエンティティはデータストアから再読み込みされる点に注意してください。
index には、0 と .length
-1 の範囲内で数値を指 定することができます。
- index が範囲外だった場合、エラーが返されます。
- index がドロップされたエンティティに対応していた場合、Null値が返されます。
EntitySelection[index]
は代入不可の式です。これは、.lock()
や .save()
などの関数において、編集可能なエンティティ参照として使用することはできない、ということを意味します。 エンティティを操作するには、戻り値を変数などの代入可能な式に割り当てる必要があります。 例:
$sel:=ds.Employee.all() // エンティティセレクションを作成
// 無効なコード:
$result:=$sel[0].lock() //動作しません
$sel[0].lastName:="Smith" //動作しません
$result:=$sel[0].save() //動作しません
// 有効なコード:
$entity:=$sel[0] //OK
$entity.lastName:="Smith" //OK
$entity.save() //OK
例題
var $employees : cs.EmployeeSelection
var $employee : cs.EmployeeEntity
$employees:=ds.Employee.query("lastName = :1";"H@")
$employee:=$employees[2] // $employees エンティティセレクションの3番目のエンティティがデータベースからリロードされます。
.attributeName
履歴
リリース | 内容 |
---|---|
17 | 追加 |
.attributeName : Collection
.attributeName : 4D.EntitySelection
説明
データクラス属性はすべてエンティティセレクションのプロパティとして利用可能で、エンティティセレクション内の属性値の "投影" を返します。 戻り値は、属性の種類 (kind が storage
あるいは relation
) によって、コレクションあるいは新しいエンティティセレクションのどちらかになります。
- attributeName で指定した属性がストレージ型の場合:
.attributeName
は attributeName と同じ型の値のコレクションを返します。 - attributeName で指定した属性がリレートエンティティ型の場合:
.attributeName
は attributeName と同じ型のリレート値の新規エンティティセレクションを返します。 重複しているエンティティは取り除かれます (返されるのは順列なしのエンティティセレクションです)。 - attributeName で指定した属性がリレートエンティティズ型の場合:
.attributeName
は attributeName と同じ型のリレート値の新規エンティティセレクションを返します。 重複しているエンティティは取り除かれます (返されるのは順列なしのエンティティセレクションです)。
エンティティセレクションのプロパティとしてリレーション属性が使用されると、返される結果は、たとえ返されるエンティティが一つだけだとしても、常に新しいエンティティセレクションとなります。 エンティティが何も返ってこない場合には、返されるのは空のエンティティセレクションです。
属性がエンティティセレクシ ョン内に存在しない場合、エラーが返されます。
例題 1
ストレージ値の投影:
var $firstNames : Collection
$entitySelection:=ds.Employee.all()
$firstNames:=$entitySelection.firstName // firstName は文字列型です
返されるのは文字列のコレクションとなります。例:
[
"Joanna",
"Alexandra",
"Rick"
]
例題 2
リレートエンティティの投影:
var $es; $entitySelection : cs.EmployeeSelection
$entitySelection:=ds.Employee.all()
$es:=$entitySelection.employer // employer は Companyデータクラスにリレートされています
返されるオブジェクトは、重複してるもの (あれば) を取り除いた、Company のエンティティセレクションです。
例題 3
リレートエンティティズの投影:
var $es : cs.EmployeeSelection
$es:=ds.Employee.all().directReports // directReports は Employee データクラスにリレートされています
返されるオブジェクトは、重複してるもの (あれば) を取り除いた、Employee のエンティティセレクションです。
.add()
履歴
リリース | 内容 |
---|---|
19 R7 | entitySelection パラメーターをサポート |
18 R5 | 追加可能なエンティティセレクションのみをサポート |
17 | 追加 |
.add( entity : 4D.Entity ) : 4D.EntitySelection
.add( entitySelection : 4D.EntitySelection ) : 4D.EntitySelection
引数 | 型 | 説明 | |
---|---|---|---|
entity | 4D.Entity | -> | エンティティセレクションに追加するエンティティ |
entitySelection | 4D.EntitySelection | -> | エンティティセレクションに追加するエンティティセレクション |
戻り値 | 4D.EntitySelection | <- | 追加した entity または entitySelection を含むエンティティセレクション |
説明
.add()
関数は、entity または entitySelection で渡したエンティティを対象のエンティティセレクションに追加し、編集されたエンティティセレクションを返します。
このコマンドは、元のエンティティセレクションを変更します。
エンティティセレクションは 追加可能 のものでなければなりません。つまり .newSelection()
あるいは Create entity selection
などで作成されたものでなければならないということです。そうでない場合、.add()
はエラーを返します。 共有可能なエンティティセレクションはエンティティの追加を受け付けないからです。 詳細については 共有可能/追加可能なエンティティセレクション を参照ください。
エンティティの追加
- エンティティセレクションが順列ありの場合、entity 引数のエンティティはセレクションの最後に追加されます。 同じエンティティへの参照がそのエンティティセレクションにすでに所属していた場合、エンティティは重複することになり、同エンティティの新しい参照が追加されます。
- エンティティセレクションが順列なしの場合、entity 引数のエンティティはセレクションの不特定の場所へ追加され、順番付けはされません。
エンティティセレクションの追加
- 元のエンティティセレクションが順列ありの場合、entitySelection 引数のエンティティセレクションはセレクションの最後に追加されます。 entitySelection 内の同じエンティティへの参照が元のエンティティセレクションにすでに所属していた場合、エンティティは重複することになり、同エンティティの新しい参照が追加されます。
- エンティティセレクションが順列なしの場合、順列ありに変更されます。
詳細については、エンティティセレクションの順列あり/順列なし を参照ください。
編集されたエンティティセレクションが関数から返されるため、関数の呼び出しをつなげることができます。
entity 引数のエンティティとエンティティセレクションが同じデータクラスに属していない場合、エラーが発生します。 追加するエンティティが Null であった場合には、エラーは発生しません。
例題 1
var $employees : cs.EmployeeSelection
var $employee : cs.EmployeeEntity
$employees:=ds.Employee.newSelection()
$employee:=ds.Employee.new()
$employee.lastName:="Smith"
$employee.save()
$employees.add($employee) //The $employee entity is added to the $employees entity selection
例題 2
関数の呼び出しをつないでいくことができます:
var $sel : cs.ProductSelection
var $p1;$p2;$p3 : cs.ProductEntity
$p1:=ds.Product.get(10)
$p2:=ds.Product.get(11)
$p3:=ds.Product.get(12)
$sel:=ds.Product.newSelection()
$sel:=$sel.add($p1).add($p2).add($p3)
例題 3
ユーザーインターフェースにおいて、2つのリストがあるとします。 ユーザーは 1つ目のリストのアイテムを複数選択し、それらを 2つ目のリストに追加します。
$sellist2:=$sellist2.add($sellist1)
.and()
履歴
リリース | 内容 |
---|---|
17 | 追加 |
.and( entity : 4D.Entity ) : 4D.EntitySelection
.and( entitySelection : 4D.EntitySelection ) : 4D.EntitySelection
引数 | 型 | 説明 | |
---|---|---|---|
entity | 4D.Entity | -> | 交差するエンティティ |
entitySelection | 4D.EntitySelection | -> | 交差するエンティティセレクション |
戻り値 | 4D.EntitySelection | <- | AND論理演算子による共通部分の結果を格納する新しいエンティティセレクション |
説明
.and()
関数は、エンティティセレクションと entity あるいは entitySelection 引数をAND論理演算子を使用して結合します。戻り値は、エンティティセレクションと引数の両方から参照されているエンティティのみを格納した、順列なしの新規エンティティセレクションです。
- entity 引数を渡した場合、引数のエンティティをエンティティセレクションと結合させることになります。 エンティティがエンティティセレクションに属している場合、そのエンティティのみを格納する新しいエンティティセレクションが返されます。 そうでない場合、空のエンティティセレクションが返されます。
- entitySelection 引数を渡した場合、二つのエンティティセレクションを結合させることになります。 両方のセレクションから参照されているエンティティのみを格納する新しいエンティティセレクションが返されます。 重複するエンティティがなかった場合、空のエンティティセレクションが返されます。
順列ありと順列なしのエンティティセレクション を比較することができます。 返されるセレクションは常に順列なしのものになります。
元のエンティティセレクションあるいは entitySelection 引数が空であった場合、あるいはentity 引数が Null であった場合、空のエンティティセレクションが返されます。
元のエンティティセレクションおよび引数が同じデータクラスのものでない場合、エラーが返されます。
例題 1
var $employees; $result : cs.EmployeeSelection
var $employee : cs.EmployeeEntity
$employees:=ds.Employee.query("lastName = :1";"H@")
// $employees エンティティセレクションには、主キー710のエンティティと
// その他のエンティティが含まれます
// 例: "Colin Hetrick" / "Grady Harness" / "Sherlock Holmes" (主キー710)
$employee:=ds.Employee.get(710) // "Sherlock Holmes" を返します
$result:=$employees.and($employee) // $result は主キー710 ("Sherlock Holmes") の
// エンティティのみを格納するエンティティセレクション。