DataClass
データクラス はデータベーステーブルへのオブジェクトインターフェース を提供します。 4Dアプリケーション内のデータクラスはすべて、ds
データストア のプロパティとして利用可能です。
概要
.attributeName
履歴
リリース | 内容 |
---|---|
19 R3 | .exposed 属性を追加 |
17 | 追加 |
.attributeName : object
説明
データクラスの属性は、データクラスのプロパティとして直接利用可能なオブジェクトです。
返されるオブジェクトのプロパティを読み取ることによって、データクラス属性に関する情報が取得できます。
データクラス属性オブジェクトを編集することは可能ですが、元となるデータベースストラクチャーは変更されません。
返されるオブジェクト
返される属性オブジェクトには以下のプロパティが格納されています:
プロパティ | タイプ | 説明 |
---|---|---|
autoFilled | Boolean | 属性値が 4D によって自動生成される場合に true です。 このプロパティは次の 4Dフィールドプロパティに対応しています: 数値型フィールドの "自動インクリメント" および UUID (文字型)フィールドの "自動UUID"。 .kind が "relatedEntity" または "relatedEntities" の場合には、このプロパティは返されません。 |
exposed | Boolean | 属性が REST で公開されている場合に trueです |
fieldNumber | integer | 属性の内部的な 4Dフィールド番号。 .kind が "relatedEntity" または "relatedEntities" の場合には、このプロパティは返されません。 |
fieldType | Integer | 属性の 4Dデータベースフィールドタイプ。 これは属性の種類 (kind ) によります。 とりうる値:.kind = "storage" の場合は、対応する 4Dフィールドタイプ (Value type 参照).kind = "relatedEntity" の場合: 38 (is object ).kind = "relatedEntities" の場合: 42 (is collection ).kind = "calculated" または "alias" の場合: 結果の値 (フィールドタイプ、relatedEntity または relatedEntities) に応じて、上に同じ |
indexed | Boolean | 属性に対して B-tree もしくは クラスターB-Tree インデックスが設定されている場合に true です。 .kind が "relatedEntity" または "relatedEntities" の場合には、このプロパティは返されません。 |
inverseName | Text | リレーション先の属性名。 .kind = "relatedEntity" または "relatedEntities" の場合にのみ返されます。 |
keywordIndexed | Boolean | 属性にキーワードインデックスが存在すれば true です。 .kind が "relatedEntity" または "relatedEntities" の場合には、このプロパティは返されません。 |
kind | Text | 属性の種類。 とりうる値:get 関数 によって定義されます。 |
必須 | Boolean | 属性において Null値の入力が拒否されている場合に true です。 .kind が "relatedEntity" または "relatedEntities" の場合には、このプロパティは返されません。 注記: このプロパティは、4Dデータベースレベルの "Null値の入力を拒否" フィールドプロパティと対応しています。 フィールドのデータ入力制御オプションである既存の "必須入力" プロパティとは無関係です。 |
name | Text | 属性名 (文字列) |
path | Text | リレーションに基づく エイリアス属性 のパス。 |
readOnly | Boolean | 読み取り専用属性の場合に trueです。 たとえば、set 関数 を持たない計算属性は読み取り専用です。 |
relatedDataClass | Text | 属性にリレートされているデータクラスの名称。 .kind = "relatedEntity" または "relatedEntities" の場合にのみ返されます。 |
type | Text | 属性の概念的な値タイプ。汎用的なプログラミングに有用です。 これは属性の種類 (kind ) によります。 とりうる値: .kind = "storage" の場合: "blob", "bool", "date", "image", "number", "object", または "string"。 数値型の場合 "number" が返されます (時間を含む)。UUID、文字およびテキスト型フィールドの場合 "string" が返されます。"blob" 属性は BLOB オブジェクト です。.kind = "relatedEntity" の場合: リレートされたデータクラス名.kind = "relatedEntities" の場合: リレートされたデータクラス名 + "Selection" 接尾辞.kind = "calculated" または "alias" の場合: 結果の値に応じて、上に同じ |
unique | Boolean | 属性値が重複不可の場合に true です。 .kind が "relatedEntity" または "relatedEntities" の場合には、このプロパティは返されません。 |
汎用的なプログラミングにおいては、プロパティが返されない場合でも有効な値を取得するため、Bool(attributeName.property)
、Num(attributeName.property)
、または String(attributeName.property)
をプロパティの型に応じて使用することが推奨されます。
例題 1
$salary:=ds.Employee.salary // Employeeデータクラスの salary属性を返します
$compCity:=ds.Company["city"] // Companyデータクラスの city属性を返します
例題 2
以下のストラクチャーを前提とします:
var $firstnameAtt;$employerAtt;$employeesAtt : Object
$firstnameAtt:=ds.Employee.firstname
//{name:firstname,kind:storage,fieldType:0,type:string,fieldNumber:2,indexed:true,
//keyWordIndexed:false,autoFilled:false,mandatory:false,unique:false}
$employerAtt:=ds.Employee.employer
//{name:employer,kind:relatedEntity,relatedDataClass:Company,
//fieldType:38,type:Company,inverseName:employees}
//38=Is object
$employeesAtt:=ds.Company.employees
//{name:employees,kind:relatedEntities,relatedDataClass:Employee,
//fieldType:42,type:EmployeeSelection,inverseName:employer}
//42=Is collection
例題 3
以下のテーブルプロパティを前提とします:
var $sequenceNumberAtt : Object
$sequenceNumberAtt=ds.Employee.sequenceNumber
//{name:sequenceNumber,kind:storage,fieldType:0,type:string,fieldNumber:13,
//indexed:true,keyWordIndexed:false,autoFilled:true,mandatory:false,unique:true}
.all()
履歴
リリース | 内容 |
---|---|
17 R5 | settings パラメーターをサポート |
17 | 追加 |
.all ( { settings : Object } ) : 4D.EntitySelection
引数 | タイプ | 説明 | |
---|---|---|---|
settings | Object | -> | ビルドオプション: context |
戻り値 | 4D.EntitySelection | <- | データクラスの全エンティティの参照 |
説明
.all()
関数はデータストアをクエリして、 データクラスの全エンティティをエンティティセレクションとして返します。
エンティティはデフォルトの順番で返され、通常は作成順になっています。 ただし、エンティティ削除後に新規追加した場合には、デフォルトの順番は作成順を反映しない点に留意が必要です。
エンティティが見つからない場合、空のエンティティセレクションが返されます。
この関数には、レイジーローディングが適用されます。
settings
任意の settings パラメーターには、追加オプションを格納したオブジェクトを渡すことができます。 以下のプロパティがサポートされています:
プロパティ | タイプ | 説明 |
---|---|---|
context | Text | エンティティセレクションに適用されている最適化コンテキストのラベル。 エンティティセレクションを扱うコードはこのコンテキストを使うことで最適化の恩恵を受けます。 この機能は ORDA のクライアント/サーバー処理を想定して設計されています。 |
データクラス内の総エンティティ数を知るには、
ds.myClass.all().length
式よりも最適化されたgetCount()
関数を使用することが推奨されます。
例題
var $allEmp : cs.EmployeeSelection
$allEmp:=ds.Employee.all()
.clearRemoteCache()
履歴
リリース | 内容 |
---|---|
19 R5 | 追加 |
.clearRemoteCache()
引数 | タイプ | 説明 | |
---|---|---|---|
引数を必要としません |
説明
.clearRemoteCache()
関数は、 データクラスの ORDAキャッシュを空にします。
この関数は
timeout
およびmaxEntries
の値をリセットしません。
例題
var $ds : 4D.DataStoreImplementation
var $persons : cs.PersonsSelection
var $p : cs.PersonsEntity
var $cache : Object
var $info : Collection
var $text : Text
$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
$persons:=$ds.Persons.all()
$text:=""
For each ($p; $persons)
$text:=$p.firstname+" lives in "+$p.address.city+" / "
End for each
$cache:=$ds.Persons.getRemoteCache()
$ds.Persons.clearRemoteCache()
// Persons データクラスのキャッシュ = {timeout:30;maxEntries:30000;stamp:255;entries:[]}
.fromCollection()
履歴
リリース | 内容 |
---|---|
17 R5 | settings パラメーターをサポート |
17 | 追加 |
.fromCollection( objectCol : Collection { ; settings : Object } ) : 4D.EntitySelection
引数 | タイプ | 説明 | |
---|---|---|---|
objectCol | Collection | -> | エンティティにマップするオブジェクトのコレクション |
settings | Object | -> | ビルドオプション: context |
戻り値 | 4D.EntitySelection | <- | コレクションから作成したエンティティセレクション |
説明
.fromCollection()
関数は、objectCol 引数のオブジェクトのコレクションに基づいてデータクラスのエンティティを更新あるいは作成し、対応するエンティティセレクションを返します。
objectCol パラメーターには、データクラスの既存エンティティを更新、または新規エンティティを作成するためのオブジェクトのコレクションを渡します。 プロパティ名は、データクラスの属性名と同一である必要があります。 プロパティ名がデータクラスに存在しない場合、それは無視されます。 コレクション内で属性値が定義されていない場合、その値は null になります。
コレクションのオブジェクト要素とエンティティのマッピングは、属性名 と 型の合致 をもって行われます。 オブジェクトプロパティがエンティティ属性と同じ名前であっても、型が合致しない場合には、エンティティの属性は空のままです。
作成モードと更新モード
objectCol 引数の各オブジェクトついて:
- オブジェクトがブール型の "_*NEW" プロパティを含み、それが false に設定されている場合(あるいは "*_NEW" プロパティが含まれていない場合)、オブジェクトの対応する値でエンティティが更新あるいは作成されます。 プライマリーキーに関するチェックはおこなわれません:
- プライマリーキーが指定されていて実在する場合、エンティティは更新されます。 この場合、プライマリーキーはそのまま、あるいは "__KEY" プロパティを (プライマリーキー値とともに) 使って指定することができます。
- そのまま指定したプライマリーキーが実在しない場合、エンティティは作成されます。
- プライマリーキーを指定していない場合、エンティティは作成され、標準のデータベースのルールに基づいてプライマリーキー値が割り当てられます。
- オブジェクトがブール型の "__NEW" プロパティを含み、それが true に設定されている場合、オブジェクトの対応する値でエンティティが作成されます。 プライマリーキーに関するチェックがおこなわれます:
- そのまま指定したプライマリーキーが実在する場合、エラーが返されます。
- そのまま指定したプライマリーキーが実在しない場合、エンティティは作成されます。
- プライマリーキ ーを指定していない場合、エンティティは作成され、標準のデータベースのルールに基づいてプライマリーキー値が割り当てられます。
値を持つ "_*KEY" プロパティは、"**NEW" プロパティが false に設定 (あるいは省略) されていて、かつ対応するエンティティが存在する場合のみ、考慮されます。 それ以外の場合には、"*_KEY" プロパティ値は無視されるため、プライマリーキーの値はそのまま渡さなければなりません。
リレートエンティティズ (複数)
objectCol 引数のオブジェクトは、一つ以上のリレートエンティティに対応するオブジェクトをネストすることができます。これはエンティティ間のリンクを作成・更新するのに有用です。
リレートエンティティに相当するネストされたオブジェクトは、リレートエンティティのプライマリーキー値を格納した "_*KEY" プロパティあるいはプライマリーキー属性を格納している必要があります。 ”*_KEY” プロパティを使用すると、プライマリーキー属性名に依存する必要がありません。
この機構によって、リレートエンティティの中身を作成・更新することはできません。
スタンプ
"__STAMP" プロパティが指定された場合、データストアのスタンプとのチェックがおこなわれ、エラーが返されることがあります ("与えられたスタンプはテーブルXXX のレコード# XXのカレントのものと合致しません")。 詳細については エンティティロッキング を参照ください。
settings
任意の settings パラメーターには、追加オプションを格納したオブジェクトを渡すことができます。 以下のプロパティがサポートされています:
プロパティ | タイプ | 説明 |
---|---|---|
context | Text | エンティティセレクションに適用されている最適化コンテキストのラベル。 エンティティセレクションを扱うコードはこのコンテキストを使うことで最適化の恩恵を受けます。 この機能は ORDA のクライアント/サーバー処理を想定して設計されています。 |
例題 1
既存のエンティティを更新します。 __NEW プロパティはなく、従業員のプライマリーキーは属性に実在の値を指定して渡します:
var $empsCollection : Collection
var $emp : Object
var $employees : cs.EmployeeSelection
$empsCollection:=New collection
$emp:=New object
$emp.ID:=668 // Employeeテーブルの実在する主キー
$emp.firstName:="Arthur"
$emp.lastName:="Martin"
$emp.employer:=New object("ID";121) // リレートデータクラス Company の実在する主キー
// リレートデータクラス Company に実在する別の主キーを指定すれば、会社を変更することができます
$empsCollection.push($emp)
$employees:=ds.Employee.fromCollection($empsCollection)
例題 2
既存のエンティティを更新します。 _*NEW プロパティはなく、従業員のプライマリーキーは *_KEY プロパティに実在の値を指定して渡します:
var $empsCollection : Collection
var $emp : Object
var $employees : cs.EmployeeSelection
$empsCollection:=New collection
$emp:=New object
$emp.__KEY:=1720 // Employeeテーブルの実在する主キー
$emp.firstName:="John"
$emp.lastName:="Boorman"
$emp.employer:=New object("ID";121) // リレートデータクラス Company の実在する主キー
// リレートデータクラス Company に実在する別の主キーを指定すれば、会社を変更することができます
$empsCollection.push($emp)
$employees:=ds.Employee.fromCollection($empsCollection)
例題 3
単純に、コレクションから新しいエンティティを作成します:
var $empsCollection : Collection
var $emp : Object
var $employees : cs.EmployeeSelection
$empsCollection:=New collection
$emp:=New object
$emp.firstName:="Victor"
$emp.lastName:="Hugo"
$empsCollection.push($emp)
$employees:=ds.Employee.fromCollection($empsCollection)
例題 4
新規エンティテ ィを作成します。 __NEW プロパティは true で、従業員のプライマリーキーは指定しません:
var $empsCollection : Collection
var $emp : Object
var $employees : cs.EmployeeSelection
$empsCollection:=New collection
$emp:=New object
$emp.firstName:="Mary"
$emp.lastName:="Smith"
$emp.employer:=New object("__KEY";121) // リレートデータクラス Company の実在する主キー
$emp.__NEW:=True
$empsCollection.push($emp)
$employees:=ds.Employee.fromCollection($empsCollection)
例題 5
新規エンティティを作成します。 __NEW プロパティはなく、従業員のプライマリーキー属性を指定しますが、その値は実在しません:
var $empsCollection : Collection
var $emp : Object
var $employees : cs.EmployeeSelection
$empsCollection:=New collection
$emp:=New object
$emp.ID:=10000 // 実在しない主キー
$emp.firstName:="Françoise"
$emp.lastName:="Sagan"
$empsCollection.push($emp)
$employees:=ds.Employee.fromCollection($empsCollection)
例題 6
2つのエンティティが同じプライマリーキーを持つ場合、最初のエンティティは作成・保存されますが、2つめのエンティティの処理は失敗します:
var $empsCollection : Collection
var $emp; $emp2 : Object
var $employees : cs.EmployeeSelection
$empsCollection:=New collection
$emp:=New object
$emp.ID:=10001 // 実在しない主キー
$emp.firstName:="Simone"
$emp.lastName:="Martin"
$emp.__NEW:=True
$empsCollection.push($emp)
$emp2:=New object
$emp2.ID:=10001 // 上と同じ主キー
$emp2.firstName:="Marc"
$emp2.lastName:="Smith"
$emp2.__NEW:=True
$empsCollection.push($emp2)
$employees:=ds.Employee.fromCollection($empsCollection)
// 最初のエンティティは作成されます
// 2つめのエンティティは重複キーエラーになります
参照
.get()
履歴
リリース | 内容 |
---|---|
17 | 追加 |
.get( primaryKey : Integer { ; settings : Object } ) : 4D.Entity
.get( primaryKey : Text { ; settings : Object } ) : 4D.Entity
引数 | タイプ | 説明 | |
---|---|---|---|
primaryKey | Integer または Text | -> | 取得するエンティティのプライマリーキー値 |
settings | Object | -> | ビルドオプション: context |
戻り値 | 4D.Entity | <- | 指定したプライマリーキーに合致するエンティティ |
説明
.get()
関数はデータクラスをクエリして、primaryKey に渡したプライマリーキーに合致するエンティティを返します。
primaryKey には、取得したいエンティティのプライマリーキーの値を渡します。 値の型は、データストアで設定されたプライマリーキーの型 (倍長整数あるいはテキスト) と合致している必要があります。 .getKey()
関数に dk key as string
引数を渡すと、プライマリーキーの値が常にテキスト型で返されるように指定することができます。
primaryKey 引数のプライマリーキーを持つエンティティが見つからない場合、Null エンティティが返されます。
この関数にはレイジーローディングが適用され、リレートデータは必要な時にのみディスクから読み込まれます。
settings
任意の settings パラメーターには、追加オプションを格納したオブジェクトを渡すことができます。 以下のプロパティがサポートされています:
プロパティ | タイプ | 説明 |
---|---|---|
context | Text | エンティティに適用されている自動の最適化コンテキストのラベル。 エンティティを読み込む以降のコードは、このコンテキストを使うことで最適化の恩恵を受けます。 この機能は ORDA のクライアント/サーバー処理を想定して設計されています。 |
例題 1
var $entity : cs.EmployeeEntity
var $entity2 : cs.InvoiceEntity
$entity:=ds.Employee.get(167) // プライマリーキーの値が 167 のエンティティを返します
$entity2:=ds.Invoice.get("DGGX20030") // プライマリーキーの値が "DGGX20030" のエンティティを返します
例題 2
context プロパティの使用について紹介します:
var $e1; $e2; $e3; $e4 : cs.EmployeeEntity
var $settings; $settings2 : Object
$settings:=New object("context";"detail")
$settings2:=New object("context";"summary")
$e1:=ds.Employee.get(1;$settings)
completeAllData($e1) // completeAllData メソッドにおいて最適化がトリガーされ、"detail" コンテキストが割り当てられます
$e2:=ds.Employee.get(2;$settings)
completeAllData($e2) // completeAllData メソッドには、"detail" コンテキストに付随する最適化が適用されます
$e3:=ds.Employee.get(3;$settings2)
completeSummary($e3) // completeSummary メソッドにおいて最適化がトリガーされ、"summary" コンテキストが割り当てられます
$e4:=ds.Employee.get(4;$settings2)
completeSummary($e4) // completeSummary メソッドには、"summary" コンテキストに付随する最適化が適用されます
.getCount()
履歴
リリース | 内容 |
---|---|
19 R5 | 追加 |
.getCount() : Integer
引数 | タイプ | 説明 | |
---|---|---|---|
result | Integer | <- | データクラスに含まれる全エンティティ数 |
説明
.getCount()
関数は、 データクラスに含まれる総エンティティ数を返します。
トランザクション内でこの関数を使用した場合、トランザクション中に作成されたエンティティは考慮されます。
例題
var $ds : 4D.DataStoreImplementation
var $number : Integer
$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
$number:=$ds.Persons.getCount()
.getDataStore()
履歴
リリース | 内容 |
---|---|
17 R5 | 追加 |
.getDataStore() : cs.DataStore
引数 | タイプ | 説明 | |
---|---|---|---|
戻り値 | cs.DataStore | <- | データクラスが属しているデータストア |
説明
.getDataStore()
関数は、 指定したデータクラスが属しているデータストアを返しま す。
返されるデータストアは次のいずれかです:
ds
コマンドによって返されるメインデータストアOpen datastore
コマンドを使用して開かれたリモートデータストア
例題
SearchDuplicate プロジェクトメソッドは、任意のデータクラス内の重複した値を検索します。
var $pet : cs.CatsEntity
$pet:=ds.Cats.all().first() // エンティティを取得します
SearchDuplicate($pet;"Dogs")
// SearchDuplicate メソッド
// SearchDuplicate(entity_to_search;dataclass_name)
#DECLARE ($pet : Object ; $dataClassName : Text)
var $dataStore; $duplicates : Object
$dataStore:=$pet.getDataClass().getDataStore()
$duplicates:=$dataStore[$dataClassName].query("name=:1";$pet.name)
.getInfo()
履歴
リリース | 内容 |
---|---|
19 R3 | exposed プロパティを追加 |
17 R5 | 追加 |
.getInfo() : Object
引数 | タイプ | 説明 | |
---|---|---|---|
戻り値 | Object | <- | データクラスの情報 |
説明
.getInfo()
関数は、 データクラスの情報を提供するオブジェクトを返します。 このメソッドは汎用的なコードを書くのに有用です。
返されるオブジェクト
プロパティ | タイプ | 説明 |
---|---|---|
exposed | Boolean | データクラスが REST に公開されていれば true |
name | Text | データクラスの名称 |
primaryKey | Text | データクラスのプライマリーキー属性の名称 |
tableNumber | Integer | 内部的な 4Dテーブル番号 |
例題 1
#DECLARE ($entity : Object)
var $status : Object
computeEmployeeNumber($entity) // エンティティに対する何らかの操作
$status:=$entity.save()
if($status.success)
ALERT("テーブル "+$entity.getDataClass().getInfo().name+" のレコードが更新されました。 ")
End if
例題 2
var $settings : Object
var $es : cs.ClientsSelection
$settings:=New object
$settings.parameters:=New object("receivedIds";getIds())
$settings.attributes:=New object("pk";ds.Clients.getInfo().primaryKey)
$es:=ds.Clients.query(":pk in :receivedIds";$settings)
例題 3
var $pk : Text
var $dataClassAttribute : Object
$pk:=ds.Employee.getInfo().primaryKey
$dataClassAttribute:=ds.Employee[$pk] // 必要に応じてプライマリーキー属性へのアクセスが可能です
.getRemoteCache()
履歴
リリース | 内容 |
---|---|
19 R5 | 追加 |
.getRemoteCache() : Object
引数 | タイプ | 説明 | |
---|---|---|---|
result | Object | <- | データクラスの ORDAキャッシュの内容を記述したオブジェクト。 |
上級者向け: この機能は、特定の構成のため、ORDAのデフォルト機能をカスタマイズする必要がある開発者向けです。 ほとんどの場合、使用する必要はないでしょう。
説明
.getRemoteCache()
関数は、データクラスの ORDAキャッシュの内容を記述したオブジェクトを返します。
4D のシングルユーザーアプリケーションからこの関数を呼び出した場合、Null
が返されます。
戻り値のオブジェクトには、以下のプロパ ティが格納されています:
プロパティ | タイプ | 説明 |
---|---|---|
maxEntries | Integer | エントリーコレクションの最大数 |
stamp | Integer | キャッシュのスタンプ |
timeout | Integer | キャッシュの新しいエントリーが期限切れとなるまでの残り時間。 |
entries | Collection | キャッシュ内の各エンティティにつき、1つのエントリーオブジェクトを格納します。 |
エントリーコレクション内の各エントリーオブジェクトは、以下のプロパティを持ちます:
プロパティ | タイプ | 説明 |
---|---|---|
data | Object | エントリーのデータを格納するオブジェクト |
expired | Boolean | エントリーが期限切れの場合に true |
key | Text | エンティティのプライマリーキー。 |
各エントリーの data
オブジェクトは、以下のプロパティを持ちます:
プロパティ | タイプ | 説明 |
---|---|---|
__KEY | String | エンティティのプライマリーキー |
__STAMP | Longint | データベース内のエンティティのタイムスタンプ |
__TIMESTAMP | String | データベース内のエンティティのスタンプ (形式: YYYY-MM-DDTHH:MM:SS:ms:Z) |
dataClassAttributeName | Variant | データクラス属性に対応するデータがキャッシュに存在する場合、それはデータベースと同じ型のプロパティに返されます。 |
リレートエンティティに関するデータは、data オブジェクトのキャッシュに保存されます。
例題
次の例で、$ds.Persons.all()
は、先頭エンティティをそのすべての属性とともにロードします。 その後リクエストの最適化がおこなわれ、firstname
と address.city
のみがロードされます。
address.city
は、Persons
データクラスのキャッシュにロードされることに注意してください。
Address
データクラスの先頭エンティティだけがキャッシュに格納されます。 先頭エンティティは、ループの最初の繰り返しでロードされます。
var $ds : 4D.DataStoreImplementation
var $persons : cs.PersonsSelection
var $p : cs.PersonsEntity
var $cachePersons; $cacheAddress : Object
var $text : Text
$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
$persons:=$ds.Persons.all()
$text:=""
For each ($p; $persons)
$text:=$p.firstname+" lives in "+$p.address.city+" / "
End for each
$cachePersons:=$ds.Persons.getRemoteCache()
$cacheAddress:=$ds.Adress.getRemoteCache()
参照
.setRemoteCacheSettings()
.clearRemoteCache()
.new()
履歴
リリース | 内容 |
---|---|
17 | 追加 |
.new() : 4D.Entity
引数 | タイプ | 説明 | |
---|---|---|---|
戻り値 | 4D.Entity | <- | データクラスの新規エンティティ |
説明
.new()
関数は、メモリ内にデータクラスに空のエンティティを新規作成しそれを返します。
エンティティオブジェクトはメモリ内に作成されますが、.save( )
関数が呼び出されるまでデータベースには保存されません。 エンティティを保存する前に削除した場合、復元することはできません。
4D Server: クライアント/サーバーにおいては、対応するテーブルのプライマリーキーが自動インクリメントであった場合、エンティティがサーバー側に保存されたときに計算されます。
エンティティの全属性は null 値で初期化されます。
4Dデータベースのストラクチャーレベルで ヌル値を空値にマップ オプションが選択されていれば、属性はデフォルト値で初期化されます。
例題
以下のコードは "Log" データクラスに新しいエンティティを作成し、"info" 属性に情報を記録します:
var $entity : cs.LogEntity
$entity:=ds.Log.new() // 参照を作成します
$entity.info:="New entry" // 情報を格納します
$entity.save() // エンティティを保存します
.newSelection()
履歴
リリース | 内容 |
---|---|
17 | 追加 |
.newSelection( { keepOrder : Integer } ) : 4D.EntitySelection
引数 | タイプ | 説明 | |
---|---|---|---|
keepOrder | Integer | -> | dk keep ordered : 順列ありのエンティティセレクションを作成しますdk non ordered (あるいは省略時): 順列なしのエンティティセレクションを作成します |
戻り値 | 4D.EntitySelection | <- | データクラスの空の新規エンティティセレクション |
説明
.newSelection()
関数は、データクラスに紐づいた追加可 能な、空の新規エンティティセレクションをメモリ内に作成します。
追加可能なエンティティセレクションについての詳細は 共有可能/追加可能なエンティティセレクション を参照ください。
順列ありのエンティティセレクションを作成するには、keepOrder に dk keep ordered
セレクターを渡します。 この引数を省略した場合のデフォルト、あるいは dk non ordered
セレクターを渡した場合には、関数は順列なしのエンティティセレクションを返します。 順列なしのエンティティセレクションの方が速いですが、エンティティの位置に頼ることはできません。 詳細については、エンティティセレクションの順列あり/順列なし を参照ください。
作成された時点では、エンティティセレクションにエンティティは含まれていません(mySelection.length
は0を返します)。 あとから add()
関数を呼び出すことで、エンティティセレクションを徐々にビルドしていくことができます。
例題
var $USelection; $OSelection : cs.EmployeeSelection
$USelection:=ds.Employee.newSelection() // 順列なしの空のエンティティセレクションを作成します
$OSelection:=ds.Employee.newSelection(dk keep ordered) // 順列ありの空のエンティティセレクションを作成します
.query()
履歴
リリース | 内容 |
---|---|
17 R6 | Formula パラメ ーターをサポート |
17 R5 | 値のプレースホルダーをサポート |
17 | 追加 |
.query( queryString : Text { ; ...value : any } { ; querySettings : Object } ) : 4D.EntitySelection
.query( formula : Object { ; querySettings : Object } ) : 4D.EntitySelection
引数 | タイプ | 説明 | |
---|---|---|---|
queryString | Text | -> | 検索条件 (文字列) |
formula | Object | -> | 検索条件 (フォーミュラオブジェクト) |
value | any | -> | プレースホルダー用の値 |
querySettings | Object | -> | クエリオプション: parameters, attributes, args, allowFormulas, context, queryPath, queryPlan |
戻り値 | 4D.EntitySelection | <- | queryString または formula に渡した検索条件に合致するエンティティから構成された新しいエンティティセレクション |
説明
.query()
関数は、データクラスの全エンティティから、queryString または formula と任意の value 引数で指定した検索条件に合致するエンティティを検索します。 戻り値は、見つかったエンティティをすべて格納する EntitySelection
型の新しいオブジェクトです。 この関数には、レイジーローディングが適用されます。
エン ティティが見つからない場合、空のエンティティセレクションが返されます。
queryString 引数
queryString 引数には、以下のシンタックスを使用します:
attributePath|formula 比較演算子 値
{論理演算子 attributePath|formula 比較演算子 値}
{order by attributePath {desc | asc}}
詳細は以下の通りです:
- attributePath: クエリの実行対象となる属性パス。 この引数は、単純な名前 ("country" など) のほか、あらゆる有効な属性パス ("country.name" など) の形をとることができます。 属性パスが
Collection
型である場合、すべてのオカレンスを管理するには[]
記法を使用してください (例:children[].age
など)。
".", "[ ]", や "=", ">", "#"..., などの特殊文字はクエリ文字列の中で正しく評価されないため、これらが含まれた属性名を直接使用することはできません。 このような属性をクエリするには、プレースホルダーの使用を検討します。これにより、属性パス内で使用できる文字の範囲が広がります (後述の プレースホルダーの使用 参照)。
-
formula: テキストまたはオブジェクト形式で渡された有効なフォーミュラ。 フォーミュラは処理されるエンティティごとに評価され、ブール値を返さなくてはなりません。 処理中のエンティティはフォーミュラ内において
This
で参照されます。- テキスト: フォーミュラ文字列の前に
eval()
ステートメントが必要です。これにより、クエリが式を正しく解釈します。 例: "eval(length(This.lastname) >=30)" - オブジェクト: フォーミュラオブジェクト は プレースホルダー (後述参照) を使って受け渡します。 このフォーミュラは、
Formula
またはFormula from string
コマンドによって作成されたものでなくてはなりません。
- テキスト: フォーミュラ文字列の前に
- 4Dフォーミュラは、
&
および|
記号のみを論理演算子としてサポートすることに留意が必要です。- フォーミュラ以外にも検索条件がある場合、クエリエンジンの最適化によってほかの検索条件 (たとえばインデックス属性) の処理が優先される場合があり、その場合はエンティティのサブセットのみがフォーミュラの評価対象となります。
クエリに使用するフォーミュラは $1 に引数を受け取ることができます。 詳細については後述の フォーミュラ引数 を参照ください。
- フォーミュラが複雑な場合など、
queryString
パラメーターを使わずに、formula
パラメーターにオブジェクトを直接渡すこともできます。 後述の フォーミュラ引数 を参照ください。- セキュリティのため、
query()
関数内のフォーミュラ使用を禁止することができます。querySettings
パラメーターの説明を参照ください。
- 比較演算子: attributePath 引数と value 引数の比較に使用する記号 以下の記号がサポートされます:
比較 | 記号 | 説明 |
---|---|---|
等しい | =, == | 一致するデータを取得します。ワイルドカード (@) をサポートし、文字の大小/アクセントの有無は区別しません。 |
===, IS | 一致するデータを取得します。ワイルドカード (@) は標準の文字として認識され、文字の大小/アクセント記号の有無は区別し ません。 | |
等しくない | #, != | ワイルドカード (@) をサポートします。 "宣言に Not 条件を適用" と同じです (後述参照) |
!==, IS NOT | ワイルドカード (@) は標準の文字として認識されます | |
宣言に Not 条件を適用 | NOT | 複数の演算子が含まれる宣言の前に NOT を使用する場合にはカッコをつける必要があります。 "等しくない" と同じです (後述参照) |
小さい | < | |
大きい | > | |
以下 | <= | |
以上 | > = | |
含まれる | IN | コレクション、あるいは複数の値のうち、どれか一つの値と等しいデータを取得します。ワイルドカード (@) をサポートします。 |
キーワードを含む | % | キーワードは、文字列あるいはピクチャー型の属性内で使用されるものが対象です。 |
- 値 (value): エンティティコレクションの各エンティティの属性のカレント値に対して比較する値。 プレースホルダー (後述の プレースホルダーの使用 参照) か、あるいはデータ型プロパティと同じ型の式を使用することができます。
定数値を使用する場合、以下の原則に従う必要があります:
- テキスト テ キスト型の定数値の場合は単一引用符つき、あるいはなしでも渡すことができます(後述の 引用符を使用する 参照)。 文字列中の文字列を検索する ("含まれる" クエリ) には、ワイルドカード記号 (@) を使用して検索文字列を指定します (例: "@Smith@")。 また以下のキーワードはテキスト定数においては使用できません: true, false。
- ブール 型の定数値: true または false (文字の大小を区別します)
- 数値 型の定数値: 浮動小数点は '.' (ピリオド) で区切られます。
- 日付 型の定数値: "YYYY-MM-DD" フォーマット。
- null 定数値: "null" キーワードを使用した場合、null と undefined プロパティの両方が検索されます。
- IN 記号を使用したクエリの場合、値 はコレクションか、attributePath の型に合致する、[ ] でくくられたカンマ区切りの値である必要があります (文字列においては、
"
の記号は\
でエスケープする必要があります)。
- 論理演算子: 複数の条件をクエリ内で結合させるのに使用します(任意)。 以下の論理演算子のいずれか一つを使用できます (名前あるいは記号のどちらかを渡します):
結合 | 記号 |
---|---|
AND | &, &&, and |
OR | |,||, or |
- order by attributePath: クエリに "order by attributePath" ステートメントを追加することで、結果をソートすることができます。 カンマで区 切ることで、複数の order by ステートメントを使用することもできます (例: order by attributePath1 desc, attributePath2 asc)。 デフォルトの並び順は昇順です。 並び順を指定するには、降順の場合は 'desc'、昇順の場合は 'asc' を追加します。
このステートメントを使用した場合、順序ありエンティティセレクションが返されます (詳細については エンティティセレクションの順列あり/順列なし を参照ください)。
引用符を使用する
クエリ内で引用符を使用する場合、クエリ内においては単一引用符 ' ' を使用し、クエリ全体をくくるには二重引用符 " " を使用します。クオートを混同するとエラーが返されます。 例:
"employee.name = 'smith' AND employee.firstname = 'john'"