フィールドごとにフィールド型を指定しなければなりません。フィールド型は、4Dがフィールドのデータをどのように処理・格納するか、またフォーム上でのデータの入力や表示に影響します。 デフォルトで新しいフィールドには文字型が割り当てられます。
フィールド型を変更するには:
テーブルイメージ上でフィールド型アイコンをクリックし、表示されるメニューから使用する型を選択します。 または 型を変更するフィールド上で右クリックし、コンテキストメニューのタイプサブメニューから新しい型を選択します。 または 型を変更するフィールドをインスペクターパレット に表示させ、タイプエリアのアイコンをクリックして型を変更します。 フィールド型は、フィールドにリレーションが設定されている、あるいは主キーに属する場合を除き、いつでも変更できます。これらのケースに該当する場合、フィールド型を選択するメニューは無効となります。フィールド型を変更するにはまずリレーションおよび主キーを取り除かなければなりません。 フィールドにデータを入力する前にフィールド型を変更した場合、4Dは単純にフィールド型を変更します。フィールドにデータを入力した後にフィールド型を変更した場合、4Dは可能であれば、データをロードする際にデータを新しい型に変換します。この変換がおこなわれても、そのレコードが更新されて保存されるまで、元のデータは保持されたままです。例えばテキストフィールドに“10以上”というデータが格納されていて、このフィールドの型を整数に変更すると、変更されたフィールドには“10”が表示されます。そのレコードを更新して保存をせずに、そのフィールドの型をテキストに戻すと、4Dは再び“10以上”を表示します。
ピクチャーフィールドを他の型に変換した場合、そのデータは表示されません。その逆も同様です。
デフォルトで4Dは以下のフィールド型をサポートします:
文字: 1から255文字長までの文字 テキスト: 2 GBまでのテキスト 日付: 100年から32,767年までの日付 時間: 時:分:秒フォーマットの時間 ブール: TRUEまたはFALSE日のみをとるフィールド 整数: -32,768から32,767の間の数値 倍長整数: +/-2,147,483,647の数値 整数64bit(1): +/- 2E64の8バイトの数値 実数: ±1.7E±308の間の浮動小数点数(13ケタの有効数字) フロート(1): 浮動小数点数 BLOB (Binary Large Object): 画像、他のアプリケーション、ドキュメントなどすべてのバイナリーオブジェクト ピクチャー: 4Dがサポートするネイティブフォーマットのピクチャー (4Dランゲージリファレンスのサポートされるネイティブフォーマット 参照) オブジェクト: 2GBまでの、JSON記法に則った属性/値のペア (1) これらの型は4DのSQLエンジンでのみ利用されます。これらのフィールドを4Dランゲージで使用すると、これらの値は内部的に実数に変換されます。
注: "文字列"という用語は文字あるいはテキストタイプを示し、"数値"は正数、倍長整数、整数64bit、実数またはフロート型を示します。
文字フィールドには文字 (文字と数字)、句読点、そしてアスタリスク (*) やパーセント (%)、ハイフン (-) などの記号を格納できます。255文字長を超えない、テキストとして扱われるべき情報を格納する場合に文字フィールドを使用します。
文字フィールドには標準インデックスあるいはキーワードインデックスを割り当てることができます。インデックスについてはインデックスの作成と変更 を参照してください。
文字は最も一般的なタイプです。典型的にこのフィールド型は名前、住所、電話番号、郵便番号などに使用します。データ入力時、文字フィールドはすべての文字、数字、句読点、記号を受け入れます。
郵便番号には2つの理由で文字フィールドを使用します: 数値フィールドは先頭の0を表示せず、また郵便番号にはハイフンが含まれます。数値フィールドタイプと文字フィールドタイプどちらを使用するかは、数値としての計算を行うか、または数値としての並び替えを行うかどうかで決定します。
文字フィールドに格納できる最大文字長として、1から255を設定できます。
2つ以上の文字フィールドを結合することができます。例えば人名の姓と名をラベルフォームに印刷したい場合などです。メソッドでは以下のように記述します:
FullName :=[Employees]First Name+" "+[Employees]Last Name
変数FullNameを表示したり印刷したりできます。あるいは情報の一部だけを別な変数にとりだすこともできます。
テキストフィールドはいくつかの点を除き、文字フィールドと同じです。
テキストフィールドには2GBまでの文字データを格納できます。一般的にテキストフィールドはコメントや説明など長い文章を保持するために使用します。
最適化のため、テキストフィールドの内容はレコードの外に保存することができます (フィールドプロパティ の"レコードに格納"参照)。この場合フィールドに標準のインデックスを割り当てることはできません。文字フィールドと同様、テキストフィールドにはキーワードインデックスを割り当てることができます。インデックスについてはインデックスの作成と変更 を参照してください。
詳細フォーム中で、テキストフィールドにスクロールバーを表示させることができます。印刷するレポートでは、すべての情報が印刷されるようテキストフィールドの大きさを (複数ページにわたって) 拡張できます。
データ入力中、テキストフィールドは基本的な編集機能 (スクロール、エリア中でのワードラップ、ダブルクリックでの文字の選択、矢印キーでの挿入ポイントの移動、そして標準のカット/コピー/ペースト処理) を提供します。複数行オプションが選択されていると、データ入力中テキストフィールドは改行を受け入れます (文字フィールドは受け入れません)。フォームオブジェクトプロパティでマルチスタイルオプションが設定されている場合、フィールドの内容を下線やボールド、フォントやサイズ、カラー指定などのスタイル付きテキストとして表示させることもできます。
テキストフィールドにワープロソフトなどからテキストをペーストできます。
注: テキストをレコードに格納する別の方法として4D Writeプラグインがあります。4D Writeでは、異なるフォント属性、段落揃えなど、標準のテキストフィールドでは利用できない他のワープロ機能を使用できます。他の4Dプラグインと同様、4D Writeエリアのデータはテキスト型ではなくBLOB型のフィールドに格納されます。4D Writeの利用に関する詳細は、 4D Write Language Referenceマニュアルの4D Writeランゲージの紹介 等を参照してください。
開始日、購入日、誕生日などの日付データを格納する場合に日付フィールドを使用します。日付フィールドは100年から32,767年までの間の日付 (年/月/日) を格納することができます。
注:
言語設定が日本の場合、日付は年/月/日 (YYYY/MM/DD) のフォーマットで指定されます。他の言語設定では他のフォーマット (MM/DD/YYYYやDD/MM/YYYY) が使用されます。4DはコンピューターのOSに設定された言語のフォーマットに基づき、日付の入力を受け付け、表示します。 データ型フィールドには32767年までの日付を格納することができますが、システムを経由する処理によっては上限にさらなる制限が課せられます。
現在時刻、開始時刻、継続時間など時間を管理する際に時間型を使用します。時間フィールドにはHH:MM:SSフォーマットで入力された時間を格納できます。
ブールフィールド (論理フィールドと呼ばれることもあります) はTRUEまたはFALSE値を格納することができます。
ブールフィールドはチェックボックスあるいは2つペアのラジオボタンとしてフォーマットできます。チェックボックスではチェックされている状態がTRUE、されていなければFALSEです。ラジオボタンの場合、最初のラジオボタンが選択されていればTRUE、二番目が選択されていればFALSEです。
ブールフィールドには質問になるようなの名前を付けることができます。検索時には質問の答えがTRUEまたはFALSEでデータベース中のブールフィールドを検索できます。例えばブールフィールドに"Gender"ではなく“Male”と名前を付けます。この場合、"Gender is equal to TRUE"ではなく、"Male is equal to TRUE"という検索条件を書けます。
整数フィールドには-32,768から32,767までの、小数点を含まない整数値を格納できます。
倍長整数フィールドは、整数型にはおさまらない整数値を格納するために使用します。小数を含まない ±2,147,483,647の値を格納できます。
この型のフィールドは8バイトを使用し、とても大きな整数 (+/- 2E64) を格納するために使用できます。
注: この型のフィールドは4DのSQLエンジンのみで使用されます。このフィールドが4Dランゲージで使用されると、内部的に実数に変換されます。
実数フィールドには小数点を含む実数値を格納します。実数フィールドには小数を含む±1.7E±308の値を格納できます。 数値表示フォーマットは自動でシステムの地域パラメター設定が使用されます。4Dは千の桁区切りと小数点を、OSに設定された文字で置き換えます。
注: 4Dデータベースエンジンでは、十分な正確性を確保するために、実数の比較は常に10^-6 の epsilon 値を用いて行われます。データと計算の一貫性を保つために、 epsilon 値は変更することができません。具体的には、データベースエンジンは SET REAL COMPARISON LEVEL コマンドの影響を受けず、このコマンドは4Dランゲージ内で実行される処理のみに影響するという事です。実数で実行される計算特有の不正確性のため、実数型は、識別子などの正確な値を保存するために使用する事は推奨されません。
このフィールドは浮動総数点数を格納するために使用します。この型の数値は精度を失うことなく、実数値を格納することができます。
注: この型のフィールドは4DのSQLエンジンでのみ使用されます。このフィールドが4Dランゲージで使用されると、値は内部的に実数に変換されます。
Blob (Binary Large Object) フィールドはあらゆる種類のバイナリーデータを格納するために使用されます。例えば他のアプリケーションで作成されたドキュメント、スキャンしたピクチャー、あるいは他のアプリケーションを格納できます。BLOBには2GBまで格納できます。BLOBフィールドを含むレコードを処理する際、BLOB全体がメモリーにロードされます。
BLOBフィールドを使用してドキュメント管理システムを作成し、ユーザーのリクエストに応じてそれを配信するといったことができます。
4DのBLOBコマンドを使用してBLOBフィールドを管理できます。
DOCUMENT TO BLOB と
BLOB TO DOCUMENT コマンドを使用してBLOBフィールドにドキュメントを読み込んだり、ドキュメントを書き出したりできます。
COMPRESS BLOB 、
EXPAND BLOB 、および
BLOB PROPERTIES コマンドを使用して、BLOBを圧縮できます。BLOBの処理に関する詳細は、4D Language Referenceマニュアルの
DISABLE MENU ITEM を参照してください。
最適化のため、BLOBはレコードの外に保存されます。BLOBは必要な時にのみロードされます。例えば検索されたレコードを一件ロードする際などです。
BLOBはあらゆるタイプのデータを表現できるため、BLOBフィールドの内容をスクリーンに表示することはできません。
ピクチャーフィールドにはグラフィックアプリケーションを使用して作成されたデジタル化された写真、図表、地図、イラストなどを格納できます。ピクチャーはネイティブフォーマットで格納されます。ピクチャーにはPostScript™や (4D v12以降は) メターデータなど出力デバイスに特別な指示を与えるための追加の情報が格納されていることがあります。この情報はピクチャーがピクチャーフィールドにコピーされる際に一緒に格納され、4Dが対応するデバイスでピクチャーを印刷する際、あるいはメタデータの場合はGET PICTURE METADATA やSET PICTURE METADATA で使用できます。
最適化のため、ピクチャーはレコードの外に保存されます。ピクチャーは必要な時にのみロードされます。例えば検索されたレコードを一件ロードする際などです。4D v13より、ピクチャーをデータファイルの外に保存できるようにもなりました (データをデータファイル外に保存 参照)。
4D v13 ではフィールドに格納された各ピクチャーごとにデフォルト名を記録できます。つまりユーザーによる書き出しやWRITE PICTURE FILE コマンド等を (fileName 引数に空の文字列を渡して ) 使用してピクチャーフィールドの内容をディスクに保存する際に使用されるデフォルトのファイル名を設定できます。フィールドの内容を変数や他のフィールドにコピーした場合、デフォルト名もコピーされます。
ピクチャーフィールドに格納されるピクチャーのデフォルト名を設定する方法は2つあります:
これは以下のように動作します:
ユーザーがピクチャーフィールドにファイル名 logo64.png を読み込みます: 次にユーザーがレコードからピクチャーを書き出します。保存ダイアログには logo64.png というファイル名がデフォルトで表示されます (これはデフォルトで提案される名前であり、変更が可能です):
オブジェクトフィールドには、異なる種類の属性/値のペアを、どんなデータスキーマでも保存することができます。保存されたデータの構造は必ずしも他のレコードと同じであるとは限りません。例えば、[Person]という住所のオブジェクトフィールドには、都市や国等によって、異なる属性を含むことができます:
record1= {"street1":"Cotton Treasure Grounds", "street2":"Place Corners", "state":"MD",...}
record2= {"street1":"Umber Road", "Number":"28", "state":"MO",...} 4Dオブジェクトのストラクチャーは標準の”属性/値”ペアの原理に基づいています。これらのオブジェクトのシンタックスはJSON記法に基づいていますが、完全に従っているわけでもありません:
属性の名前 は必ずテキストです。たとえば"Name"など。 属性の値 は、以下のうちのどれかの形をとります:数字(実数、整数、等) テキスト 配列(テキスト、実数、倍長整数、整数、ブール、オブジェクト、ポインター) ヌル ブール 日付("YYYY-MM-DDTHH:mm:ssZ"フォーマット) オブジェクト(オブジェクトは複数の階層に置くことができます) 警告: 属性名は大文字と小文字を区別するという点に注意して下さい。
オブジェクトファイルは最大で2GBまでです。オブジェクトフィールドを含むレコードを使用しているとき、オブジェクト全てがメモリーへと読み込まれます。ちょうどテキスト、ピクチャーやBLOBフィールドのように、オブジェクトフィールドもデータファイル内部(レコード内、またはレコード外)に、またはデータファイル外に保存することができます。このオプションについてはデータをデータファイル外に保存 の章に詳細があります。
オブジェクトフィールドを管理するためには4Dのオブジェクト(ランゲージ) コマンドを使用して下さい。オブジェクトフィールドからのデータの読み出し、書き込みについてはOB Get と OB SET コマンドを使用して下さい。また、OB SET ARRAY と OB GET ARRAY コマンドを使用することで配列を属性として保存・読み出しができます。
専用のQUERY BY ATTRIBUTE 、QUERY SELECTION BY ATTRIBUTE 、DISTINCT ATTRIBUTE VALUES コマンド、あるいはDISTINCT ATTRIBUTE PATHS コマンドを使用してオブジェクトフィールド内のクエリや処理を実行することができます。
オブジェクトフィールドはテキストベースなので、オブジェクトフィールドの中身は4DフォームにおいてはデフォルトでJSONにフォーマットされたテキストとして表示されます(以下の章を参照して下さい)。
注: JSONオブジェクトを扱うためには、"JSON " テーマのコマンドを使用して下さい。
オブジェクトフィールド型を使用すると、スキーマレスでダイナミックなフィールドを定義することができます。これらのオブジェクトフィールドは"ユーザー定義の"、または"カスタムの"フィールドとみなすこともできます。4D では、スキーマデータモデルとスキーマレスデータモデルの二つの選択肢があります。どちらの場合においても、インデックス付きの速いクエリを実行することができます。
また、オブジェクトフィールドはデータモデルを単純化することもできることに注意して下さい。例えば、よくある"Contacts"というテーブルについて、一つのオブジェクトフィールドがあるだけで、可能性がある、ありとあらゆる値をのために無数にフィールドを作成する必要がなくなります(またそのようなフィールドは90%の割合で結局のところ使用されません)。情報モデルは必要に応じてオン・ザ・フライで作成することが可能です。
オブジェクト(ランゲージ) テーマ内の全てのコマンドは第一引数(object )としてオブジェクトフィールドを受け入れるようになりました。
標準のランゲージオブジェクトの様に、オブジェクトフィールド値はオブジェクト(ランゲージ) テーマのコマンドを使用して管理することができます。例えば:
OB SET ([Perso ns]Identity_OB;"First Name";$firstName )
OB SET ([Perso ns]Identity_OB;"Last Name";$lastName )
$firstName :=OB Get ([Perso ns]Identity_OB;"First Name")
$lastName :=OB Get ([Perso ns]Identity_OB;"Last Name")
配列もまたサポートされます。例えば:
ARRAY TEXT ($arrGirls ;3)
$arrGirls {1}:="Emma"
$arrGirls {2}:="Susan"
$arrGirls {3}:="Jamie"
OB SET ARRAY ([Perso ns]Children;"Girls";$arrGirls )
オブジェクトフィールドの属性への編集を保存するためには、ほとんどの場合において、レコードを保存する前に4Dに明示的に変更を通知する必要があります。この通知とはオブジェクトフィールドを自分自身へと再割り当てすることで実行されます:
[Perso ns]Identity_OB:=[Perso ns]Identity_OB
SAVE RECORD ([Perso ns])
オブジェクト参照は、アプリケーション内の他の場所(他のオブジェクトフィールドなど)でも使用される可能性もあるため、このステップは必要になります。4Dランゲージは、オブジェクトフィールドの属性が変更されていたとしてもそれをレコードの保存時に検知することはできません。
属性が変更された場合には、直ちにそのフィールドを再割り当てし、その中身を保存する必要があります:
注: OB SET コマンドを使用して第1階層の属性を管理する場合には、フィールドの再割り当ては必要ありません:
OB SET ([Rect]Desc ;"x";"50";"y";"50";"color";"blue")
SAVE RECORD ([Rect] )
オブジェクトフィールドはフォーミュラの中で使用することができます(標準のフォーミュラエディタ、またはEXECUTE FORMULA コマンドを使用します)。しかしながら、このコンテキストにおいては、オブジェクトフィールドは以下のコマンドの使用でしか扱う事ができません:
例えば、以下のクエリフォーミュラを実行することができます:
OB Get ([Rect]Desc ;"color")="blue"
デフォルトで、オブジェクトフィールドは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 コマンドを通してオブジェクトフィールドの中身を管理する方がより正確です。
ほとんどの4D標準の機能は、オブジェクトフィールドのデータの方に限らずサポートします。しかしながら、アプリケーション内のいくつかの特殊な部分においては、現在のリリースにおいてはオブジェクトフィールドに未対応な部分もあります。これらの部分は将来のリリースにおいてアップデートされ、徐々に使用可能になって行く予定です。
以下の機能またはコマンドは、4Dフォーミュラを通して部分的にオブジェクトフィールドをサポートします:
機能/コマンド クエリエディター 並べ替えエディター 読み込み/書き出しエディター(4Dアプリケーションフォーマットに対しては自動的にサポートされますが、テキストフォーマットについてはフォームを使用する必要があります) 4D Write 4D Write Pro 4D View 4D Tags PROCESS 4D TAGS
以下の4Dの機能やコマンドは、オブジェクトフィールドをサポートしません: