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
引数 | 型 | 説明 | |
---|---|---|---|
戻り値 | 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
引数 | 型 | 説明 | |
---|---|---|---|
戻り値 | Object | <- | データクラスの ORDAキャッシュの内容を記述したオブジェクト。 |
上級者向け: この機能は、特定の構成のため、ORDAのデフォルト機能をカスタマイズする必要がある開発者向けです。 ほとんどの場合、使用する必要はないでしょう。
説明
.getRemoteCache()
関数は、データクラスの ORDAキャッシュの内容を記述したオブジェクトを返します。
4D のシングルユーザーアプリケーションからこの関数を呼び出した場合、Null
が返されます。
戻り値のオブジェクトには、以下のプロパティが格納されています:
プロパティ | 型 | 説明 |
---|---|---|
maxEntries | Integer | エントリーコレクションの最大数 |
stamp | Integer | キャッシュのスタンプ |
timeout | Integer | キャッシュの新しいエントリーが期限切れとなるまでの残り時間。 |
entries | Collection | キャッシュ内の各エンティティにつき、1つのエントリーオブジェクトを格納します。 |
エントリーコレクション内の各エントリーオブジェクトは、以下のプロパティを持ちます:
プロパティ |
---|