4D v15

オブジェクトフィールドデータ型

ホーム

 
4D v15
オブジェクトフィールドデータ型

オブジェクトフィールドデータ型  


 

 

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 GetOB SET コマンドを使用します。また、OB SET ARRAYOB GET ARRAY コマンドを使用することによって配列を属性として保存・読み出しができます。

オブジェクトフィールドはテキストベースであるために、オブジェクトの中身は4Dフォーム内においてはデフォルトでJSONフォーマットされたテキストとして表示されます(以下の章を参照して下さい)。

注: JSONオブジェクトを扱うためには、"JSON" テーマ内のコマンドを使用して下さい。

デフォルトで、オブジェクトフィールドは4D フォーム内ではテキストエリアとして表示されます。これらのエリアのうち、オブジェクトデータは、未定義か、またはJSONテキストとしてフォーマットされている必要があります。そうでない場合には、エラーが返されます。

例えば、[Rect]Descというフィールドをオブジェクトフィールドとして定義した場合、以下のように書くことができます:

 CREATE RECORD([Rect])
 [Rect]Name:="Blue square"
 OB SET([Rect]Desc;"x";"50";"y";"50";"color";"blue")
 SAVE RECORD([Rect])

[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ランゲージは、オブジェクトフィールドをサポートするようにアップデートされました。具体的には以下のような点です:

  • オブジェクト(ランゲージ) テーマのコマンドは全てオブジェクトフィールドを第一引数(object)として受け入れるようになりました。
  • オブジェクトフィールドでのクエリを管理するために、新しいコマンドが追加されました。このコマンドは別の章にて詳細な説明があります。
  • SELECTION TO ARRAYSELECTION RANGE TO ARRAYARRAY TO SELECTION コマンドは、ARRAY OBJECT バインディングを通してオブジェクトフィールドをサポートします。
  • Selection to JSONJSON TO SELECTION コマンドはオブジェクトフィールドをサポートします。その際、自動的にJSONフォームに変換されます。
    しかしながら、以下の4D式は曖昧であるという点に注意して下さい:
     Selection to JSON([aTable];objectField)

    以下の様に解釈することが可能です:
    - tableのテーブルのカレントセレクション内のobjectField のフィールドの全ての値からJSONを生成
    - 'objectField' のカレントレコード値をテンプレートしてJSONを生成
    この場合4Dは最初の解釈を使用した振る舞いを行います。こちらの方がより一般的に使用されている解釈だからです。
  • OldModified コマンドはオブジェクトフィールドをサポートします。
SET FIELD VALUE NULL はオブジェクトフィールドの中身を消去します。
  • GET FIELD PROPERTIESIs object を返すようになりました。
  • PROCESS 4D TAGS は、フォーミュラ内においてのみ,オブジェクトフィールドをサポートします。

ただし、技術的な理由から、一部のコマンドはオブジェクトフィールドをサポートしない点に注意して下さい。これらのコマンドは以下のセクションにまとめられています。

オブジェクトフィールドはフォーミュラの中で使用することができます(標準のフォーミュラエディタ、またはEXECUTE FORMULA コマンドを使用します)。しかしながら、このコンテキストにおいては、オブジェクトフィールドは以下のコマンドの使用でしか扱う事ができません:

例えば、以下のクエリフォーミュラを実行することができます:

 OB Get([Rect]Desc;"color")="blue"

ほとんどの4D標準の機能は、オブジェクトフィールドのデータの方に限らずサポートします。しかしながら、アプリケーション内のいくつかの特殊な部分においては、現在のリリースにおいてはオブジェクトフィールドに未対応な部分もあります。これらの部分は将来のリリースにおいてアップデートされ、徐々に使用可能になって行く予定です。

以下の機能またはコマンドは、4Dフォーミュラを通して部分的にオブジェクトフィールドをサポートします:

機能/コマンド
クエリエディター
並べ替えエディター
読み込み/書き出しエディター(4Dアプリケーションフォーマットに対しては自動的にサポートされますが、テキストフォーマットについてはフォームを使用する必要があります)
4D Write
4D Write Pro
4D View
4D Tags
PROCESS 4D TAGS

以下の4Dの機能やコマンドは、オブジェクトフィールドをサポートしません:

機能/コマンド
クイックレポートエディター
ラベルエディター
Graphs
PHP
SDK プラグイン
SQL データ定義ランゲージ(CREATE TABLE)
SQL データ操作ランゲージ(SELECT, INSERT, UPDATE)
SQL EXPORT DATABASESQL EXPORT SELECTION
DISTINCT VALUES
RELATE ONE
RELATE MANY
ORDER BY
SCAN INDEX



参照 

QUERY BY ATTRIBUTE

 
プロパティ 

プロダクト: 4D
テーマ: デザインモード

 
履歴 

 
ARTICLE USAGE

4D v15 - アップグレードリファレンス(Rリリース版) ( 4D v15)

Parent of : オブジェクトフィールドデータ型 ( 4D v15)