4D v15以降、新しいオブジェクトフィールド型が4Dデータベースエンジンによってサポートされるようになりました。オブジェクトフィールドデータ型を使用すると、以下のようなことが可能になります:
- データファイル内部にオブジェクトを保存する
- 動的にオブジェクトの属性を追加、編集、または削除する
- 属性でオブジェクトをクエリする
- オブジェクトの値を読み込む/書き出す、等
実装に関する注意: 一部の機能では、現在オブジェクトをフィールドをサポートしていません(以下の 現状での制約 の章を参照して下さい)。
オブジェクトフィールド型を使用すると、スキーマレスでダイナミックなフィールドを定義することができます。これらのオブジェクトフィールドは"ユーザー定義の"、または"カスタムの"フィールドとみなすこともできます。4D v15では、スキーマデータモデルとスキーマレスデータモデルの二つの選択肢があります。どちらの場合においても、インデックス付きの速いクエリを実行することができます。
また、オブジェクトフィールドはデータモデルを単純化することもできることに注意して下さい。例えば、よくある"Contacts"というテーブルについて、一つのオブジェクトフィールドがあるだけで、可能性がある、ありとあらゆる値をのために無数にフィールドを作成する必要がなくなります(またそのようなフィールドは90%の割合で結局のところ使用されません)。情報モデルは必要に応じてオン・ザ・フライで作成することが可能です。
新しいオブジェクトフィールドデータ型は、他のデータ型と同じようにストラクチャーエディターのインスペクターを使用して設定することができます:

4D オブジェクトフィールドは異なる種類の属性/値のペアを事前にデータスキーマを定義することなく保存することができます。保存されたデータストラクチャーは、異なるレコード間において必ずしも同じとは限りません。例えば、[Person]Address オブジェクトフィールドは都市や国等に応じて、異なる属性を含めることができます:
record1= {"street1":"Cotton Treasure Grounds", "street2":"Place Corners", "state":"MD",...}
record2= {"street1":"Umber Road", "Number":"28", "state":"MO",...}
4Dオブジェクトのストラクチャーは、"属性/値"ペアの標準原理に基づいています。これらのオブジェクトのシンタックスはJSON記法を基にしておりますが、全て準拠しているという訳でもありません:
- 属性の名前は常にテキストです。例:"Name"等
- 属性の値は、以下の型のどれかを取ります:
- 数(実数、整数、等)
- テキスト
- 配列(テキスト、実数、倍長整数、整数、ブール、オブジェクト、ポインター)
- null
- ブール
- ポインター(保存時はポインターとして保存されますが、JSON Stringify コマンド使用時、または複製の際には評価されます)
- 日付("YYYY-MM-DDTHH:mm:ssZ" フォーマット)
- オブジェクト(オブジェクトは複数の階層へと保存することが可能です)
警告: 属性名は大文字と小文字を区別するという点に注意して下さい。
オブジェクトフィールドのサイズは2GBが上限です。オブジェクトフィールドを内包しているレコードを扱っている場合、オブジェクト全体がメモリーへと読み込まれます。テキスト、ピクチャー、BOBフィールドと同じように、オブジェクトフィールドは(レコード内かそうでないかに関わらず)データファイル内に保存することができますし、データファイル外に保存することもできます。このオプションについてはデザインリファレンスマニュアルのデータをデータファイル外に保存 の章において詳細な説明があります。
オブジェクトフィールドはインデックスを付けることができます(自動オプションのみ)。つまり、全ての属性パスは自動的にインデックスされるという事です。また、非表示にすることもできますし、4D Mobileサービスで公開の属性を使用することもできます。その一方で、オブジェクトフィールドは重複不可を設定することはできません。
オブジェクトフィールドを管理するためには4Dの
オブジェクト(ランゲージ) コマンドを使用します。オブジェクトフィールドからデータを読み出し、あるいは書き込みするためには
OB Get と
OB SET コマンドを使用します。また、
OB SET ARRAY と
OB GET ARRAY コマンドを使用することによって配列を属性として保存・読み出しができます。
オブジェクトフィールドはテキストベースであるために、オブジェクトの中身は4Dフォーム内においてはデフォルトでJSONフォーマットされたテキストとして表示されます(以下の章を参照して下さい)。
注: JSONオブジェクトを扱うためには、"
JSON" テーマ内のコマンドを使用して下さい。
デフォルトで、オブジェクトフィールドは4D フォーム内ではテキストエリアとして表示されます。これらのエリアのうち、オブジェクトデータは、未定義か、またはJSONテキストとしてフォーマットされている必要があります。そうでない場合には、エラーが返されます。
例えば、[Rect]Descというフィールドをオブジェクトフィールドとして定義した場合、以下のように書くことができます:
[Rect]Descフィールドがフォーム内に含まれているとき、以下の内容が表示されます:

テキストフィールド内にて表示されている値を直接編集することもできますし、標準のオブジェクト記法を使用してオブジェクトデータを直接入力することもできます。[Tab] キーを押すと、オブジェクトは自動的にJSON形式にフォーマットされます:

しかしながら、直接編集する際には細心の注意を払って行うべきです。何故なら、誤った場所に入った空白や記号などは、JSON解析エラーとなり、編集したデータは保存されないからです:

一般的には、オブジェクト(ランゲージ) と JSONコマンドを通してオブジェクトフィールドの中身を管理する方がより正確です。
オブジェクト(ランゲージ)テーマ内の全てのコマンドは第一引数(object)としてオブジェクトフィールドを受け入れるようになりました。
標準のランゲージオブジェクトの様に、オブジェクトフィールド値はオブジェクト(ランゲージ)テーマのコマンドを使用して管理することができます。例えば:
OB SET([Persons]Identity_OB;"First Name";$firstName)
OB SET([Persons]Identity_OB;"Last Name";$lastName)
$firstName:=OB Get([Persons]Identity_OB;"First Name")
$lastName:=OB Get([Persons]Identity_OB;"Last Name")
配列もまたサポートされます。例えば:
ARRAY TEXT($arrGirls;3)
$arrGirls{1}:="Emma"
$arrGirls{2}:="Susan"
$arrGirls{3}:="Jamie"
OB SET ARRAY([Persons]Children;"Girls";$arrGirls)

4Dランゲージは、オブジェクトフィールドをサポートするようにアップデートされました。具体的には以下のような点です:
SET FIELD VALUE NULL はオブジェクトフィールドの中身を消去します。
ただし、技術的な理由から、一部のコマンドはオブジェクトフィールドをサポートしない点に注意して下さい。これらのコマンドは以下のセクションにまとめられています。
オブジェクトフィールドはフォーミュラの中で使用することができます(標準のフォーミュラエディタ、またはEXECUTE FORMULA コマンドを使用します)。しかしながら、このコンテキストにおいては、オブジェクトフィールドは以下のコマンドの使用でしか扱う事ができません:
例えば、以下のクエリフォーミュラを実行することができます:
OB Get([Rect]Desc;"color")="blue"
ほとんどの4D標準の機能は、オブジェクトフィールドのデータの方に限らずサポートします。しかしながら、アプリケーション内のいくつかの特殊な部分においては、現在のリリースにおいてはオブジェクトフィールドに未対応な部分もあります。これらの部分は将来のリリースにおいてアップデートされ、徐々に使用可能になって行く予定です。
以下の機能またはコマンドは、4Dフォーミュラを通して部分的にオブジェクトフィールドをサポートします:
機能/コマンド |
クエリエディター |
並べ替えエディター |
読み込み/書き出しエディター(4Dアプリケーションフォーマットに対しては自動的にサポートされますが、テキストフォーマットについてはフォームを使用する必要があります) |
4D Write |
4D Write Pro |
4D View |
4D Tags |
PROCESS 4D TAGS |
以下の4Dの機能やコマンドは、オブジェクトフィールドをサポートしません: