EntitySelection
エンティティセレクションとは、同じ データクラス に所属する一つ以上の エンティティ への参照を格納しているオブジェクトのことです。 エンティティセレクションは、データクラスから 0個、1個、あるいは X個のエンティティを格納することができます (X はデータクラスに格納されているエンティティの総数です)。
.all()
、.query()
などの DataClass
クラス の関数や、.and()
、orderBy()
など EntitySelectionClass
クラス自身の関数を用いて、既存のセレクションからエンティティセレクションを作成することができます 。 また、dataClass.newSelection()
関数または Create entity selection
コマンドを使用して、空のエンティティセレクションを作成することもできます。
概要
Create entity selection
Create entity selection ( dsTable : Table { ; settings : Object } ) : 4D.EntitySelection
引数 | 型 | 説明 | |
---|---|---|---|
dsTable | Table | -> | エンティティセレクションの元となるカレントセレクションが属する 4Dデータベースのテーブル |
settings | Object | -> | ビルドオプション: context |
戻り値 | 4D.EntitySelection | <- | 指定したテーブルに対応するデータクラスのエンティティセレクション |
|
説明
Create entity selection
コマンドは、dsTable で指定したテーブルに対応するデータクラスの 追加可能な 新規エンティティセレクションを、同テーブルのカレントセレクションに基づいてビルドして返します。
ソートされたカレントセレクションの場合、順列のある エンティティセレクションが作成されます (カレントセレクションの並び順が受け継がれます)。 カレントセレクションがソートされていない場合、順列のないエンティティセレクションが作成されます。
ds
において dsTable が公開されていない場合には、エラーが返されます。 リモートデータストアの場合は、このコマンドは使用できません。
任意の settings には、以下のプロパティを持つオブジェクトを渡せます:
プロパティ | 型 | 説明 |
---|---|---|
context | Text | エンティティセレクションに適用されている 最適化コンテキスト のラベル。 |
例題
var $employees : cs.EmployeeSelection
ALL RECORDS([Employee])
$employees:=Create entity selection([Employee])
// $employees エンティティセレクションには、
// Employee データクラスの全エンティティへの参照が格納されています
参照
[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()
履歴
リリース | 内容 |
---|---|
18 R5 | 追加可能なエンティティセレクションのみをサポート |
17 | 追加 |
.add( entity : 4D.Entity ) : 4D.EntitySelection
引数 | 型 | 説明 | |
---|---|---|---|
entity | 4D.Entity | -> | エンティティセレクションに追加するエンティティ |
戻り値 | 4D.EntitySelection | <- | 追加エンティティを含むエンティティセレクション |
|
説明
.add()
関数は、 entity に渡したエンティティをエンティティセレクションに追加し、編集されたエンティティセレクションを返します.
このコマンドは、元のエンティティセレクションを変更します。
警告: エンティティセレクションは 追加可能 のものでなければなりません。つまり .newSelection()
あるいは Create entity selection
などで作成されたものでなければならないということです。そうでない場合、.add()
はエラーを返します。 共有可能なエンティティセレクションはエンティティの追加を受け付けないからです。 詳細については 共有可能/追加可能なエンティティセレクション を参照ください。
- エンティティセレクションが順列ありの場合、entity 引数のエンティティはセレクションの最後に追加されます。 同じエンティティへの参照がそのエンティティセレクションにすでに所属していた場合、エンティティは重複することになり、同エンティティの新しい参照が追加されます。
- エンティティセレクションが順列なしの場合、entity 引数のエンティティはセレクションの不特定の場所へ追加され、順番付けはされません。
詳細については、エンティティセレクションの順列あり/順列なし を参照ください。
編集されたエンティティセレクションが関数から返されるため、関数の呼び出しをつなげることができます。
entity 引数のエンティティとエンティティセ レクションが同じデータクラスに属していない場合、エラーが発生します。 追加するエンティティが Null であった場合には、エラーは発生しません。
例題 1
var $employees : cs.EmployeeSelection
var $employee : cs.EmployeeEntity
$employees:=ds.Employee.query("lastName = :1";"S@") // 共有可能なエンティティセレクションです
$employee:=ds.Employee.new()
$employee.lastName:="Smith"
$employee.save()
$employees:=$employees.copy() // 追加可能なエンティティセレクションを取得します
$employees.add($employee) // $employee エンティティが $employees エンティティセレクションへと追加されます
例題 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.query("ID > 50")
$sel:=$sel.copy()
$sel:=$sel.add($p1).add($p2).add($p3)
.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") の
// エンティティのみを格納するエンティティセレクション。
例題 2
"Jones" という名前で、New York に住んでいる従業員のセレクションを取得します:
var $sel1; $sel2; $sel3 : cs.EmployeeSelection
$sel1:=ds.Employee.query("name =:1";"Jones")
$sel2:=ds.Employee.query("city=:1";"New York")
$sel3:=$sel1.and($sel2)
.average()
履歴
リリース | 内容 |
---|---|
18 R6 | エンティティセレクションが空の場合には undefined を返します |
17 | 追加 |
.average( attributePath : Text ) : Real
引数 | 型 | 説明 | |
---|---|---|---|
attributePath | Text | -> | 計算に使用する属性パス |
戻り値 | Real | <- | エンティティの属性値の算術平均 (相加平均) (エンティティセレクションがからの場合には undefined を返します) |
|
説明
.average()
関数は、 attributePath に指定した、エンティティセレクション内の null でない値の算術平均 (相加平均) を返します.
attributePath 引数として、評価する属性パスを渡します。
計算の対象となるのは数値のみです。 ただし、エンティティセレクションの attributePath 引数で指定したパスに異なる型の値が混在している場合、.average()
はすべてのスカラー要素を対象として平均値を算出します。
日付値は数値 (秒数) に変換され、平均を計算するのに使用されます。
エンティティセレクションが空の場合、または attributePath 引数に数値型の値が含まれていない場合には、.average()
は undefined を返します。
以下の場合には、エラーが返されます:
- attributePath はリレート属性である
- attributePath がエンティティセレクションデータクラス内に存在しない属性を指定している場合。