レコード
レコードとセレクションは、4D デベロッパーが 4D データベースのデータにアクセスして操作するための主要なツールです。これらは レガシーな概念 です。新規開発では、モダンな ORDA アーキテクチャー に依拠することが推奨されます。ただし、これらは依然として完全に機能し、既存の 4D 開発で広く使用されています。
レコードの操作
ORDA テクノロジー は、必要に応じてデータベースレベルで基盤となるレコードを作成、変更、削除します。たとえば、新しいエンティティを作成する 際にレコードが作成されます。
新しいレコードの追加
4D アプリケーションでは、次を使用してレコードを追加します:
- コマンド:
CREATE RECORDはメモリ内にレコードを作成します(新しいレコードを実際にデータに保存するにはSAVE RECORDを使用する必要があります)。ADD RECORDはデータ入力の準備が整った入力フォームをユーザーに開きます。ARRAY TO SELECTIONは配列内の対応するデータからレコードを作成します。 - インポートとエクスポートテーマ のコマンドまたはインポートダイアログボックスを使用したデータインポート機能。
- 標準アクション:リストにレコードを追加する
Add Subrecord。 - 4D IDE のインターフェースおよびメニューコマンド:レコード メニューの 新規レコード および リストに新規レコード。
ほとんどの場合、レコードはメモリ内にのみ作成されるため、新しいレコードを実際にデータに保存するには、インターフェースを介して、または SAVE RECORD や accept 標準アクション などのコマンドを使用して、明示的に保存する必要があります。
レコードの変更
情報を更新する必要がある場合や、当初入力された情報が正しくないことが判明した場合に、レコードを変更します。レコードのグループを変更する前に、変更するレコードを カレントセレクション として選択します。検索して変更するレコードを選択することも、出力フォーム でレコードを強調表示した後に選択することもできます。
レコードが別のプロセスまたは別のユーザー(リモートモード)によって変更されている場合、そのレコードは ロックされている と言われます。ロックされたレコードは表示できますが、変更することはできません。ロックされたレコードを開いた場合、フィールドの入力内容を表示することはできますが、データを変更することはできません。
4D アプリケーションでは、次を使用してレコードを変更します:
- コマンド:
MODIFY RECORDはデータ変更の準備が整った入力フォームをユーザーに開きます。ARRAY TO SELECTIONは配列から選択されたレコードのデータを変更します。 - インポートとエクスポートテーマ のコマンドまたはインポートダイアログボックスを使用したデータインポート機能。
- 標準アクション:リスト内のレコードを編集する
Edit Subrecord。 - 4D IDE のインターフェースおよびメニューコマンド:レコード メニューの レコードを変更 またはリストフォーム内でのダブルクリック。
ほとんどの場合、レコードはメモリ内でのみ変更されるため、変更したレコードを実際にデータに保存するには、インターフェースを介して、または SAVE RECORD や accept 標準アクション などのコマンドを使用して、明示的に保存する必要があります。
グローバル更新
レコードのグループに対して特定の変更を加えたい場合に、グローバル更新をおこないます。そうしなければ手間がかかり時間のかかるレコードグループへの変更を自動化するために、グローバル更新を実行します。たとえば、[在庫] テーブルのすべての価格を一定の割合で変更したり、数値フィールドや文字フィールドをフォーマットしたりする場合に、グローバル更新を実行します。
グローバル更新は、カレントセレクションのレコードに数式を「適用」することでおこなわれます。言い換えれば、数式はカレントセレクション内の各レコードに変更を加えるために使用されます。以下はいくつかの数式の例です:
- 次の数式は、給与フィールドを 1.05 倍します。たとえば、昇給が実施される際に使用できます:
[Emp]Salary:=[Emp]Salary*1.05
- 次の例は、組み込み関数を使用して州フィールドの内容を大文字にします。ラベルやレポートにおける州の表示の統一性を保証します:
[Customer]State:=Uppercase([Customer]State)
- この数式には、姓フィールドの最初の文字を大文字にし、残りのすべての文字を小文字にする、ユーザーが記述した関数が含まれています。
[Emp]Last Name:=Capitalize([Emp]Last_Name)
グローバル更新を実行する際にユーザーが記述した関数を組み込める機能は、4D の強力な機能です。数式には、4D 言語関数のほか、プロジェクトメソッドを含めることができます。セキュリティ上の理由から、数式内のプロジェクトメソッドへのアクセスは、セキュリティ設定 および/または SET ALLOWED METHODS コマンド によって制限されています。
1 つの論理行より長い数式を記述することはできません。言い換えれば、キャリッジリターンを押して 2 行目を入力することはできません。ただし、数式エディターで使用可能と宣言されたメソッドは、当然ながら複数行で構成できます。
グローバル更新を実行するには、EXECUTE FORMULA コマンドを介して更新用の数式を直接実行するか、EDIT FORMULA コマンドを介して数式エディターを表示します。
4D IDE では、数式エディター を使用して、カレントセレクションの各レコードに適用される数式を記述することもできます。これをおこなうには、レコード メニューの 数式を適用... コマンドを選択し、数式を記述します。以前にディスクにファイル(拡張子 .4fr)として保存された数式を読み込むこともできます。
レコードの削除
古くなった、あるいは不要になったレコードを削除したい場合があります。レコードは必要だが、レコードに格納されている値が正しくない場合は、レコードを削除するのではなく変更すべきです。
レコードは 2 つの方法で削除できます:
- レコードを個別に削除する。
- レコードのセットを削除する。
レコードの削除は、Delete Record または Delete Subrecord(リスト内での削除)標準アクションを介して、あるいは DELETE RECORD または DELETE SELECTION コマンドを介しておこなわれます。
4D IDE では、編集 メニューの 消去 コマンドや削除キーを使用することもできます。
レコードの削除は永久的であり、データベースのバックアップを復元することでしか元に戻せません。レコードを削除すると、4D は削除の確認を求めるダイアログボックスを表示します。
レコードを削除する前に、削除したいレコードのセレクションを作成します。セレクションに ロックされたレコード が含まれている場合、削除は続行されますが、ロックされたレコードは削除されず、削除後もカレントセレクションに残ります。これらのレコードを削除するには、それらがロック解除される(つまり、使用されなくなる)まで待つ必要があります。この種のシナリオを管理するには、"Record Locking" テーマのコマンド を使用できます。
別のプロセスで削除されたレコード
カレントセレクションは、別のプロセスで削除されたレコードによって変化することがあります。たとえば、データベースで作業している間に、テーブルから特定のレコードを削除する別のプロセスを開始することがあります。そのプロセスで削除されたレコードは、テーブルから永久に取り除かれます。ただし、データベースでの作業中に表示されるレコードは、新しいレコードのセレクションが作成されるまで、テーブルへのそれらの変更を反映しない場合があります。
この点を説明するために、テーブルに 50 件のレコードが含まれ、すべてのレコードがカレントセレクションに含まれているとします。この時点で、出力フォームのタイトルバーには「50 分の 50」件のレコードが選択されていると表示されます。別のプロセスでレコードの 1 つが削除されると、タイトルバーは「49 分の 50」件のレコードが選択されていると表示されるように変わります。カレントセレクションにテーブルよりも多くのレコードがあるように見えるようになりました! タイトルバーは、カレントセレクションを変更したときに更新されます。
削除されたレコードを変更または削除しようとすると、レコードが削除されたことを示すダイアログボックスが表示されます。
別のユーザーによって削除されたレコードも、カレントセレクションに同じ影響を与えます。レコードはテーブルからは削除されますが、カレントセレクションからは削除されません。したがって、カレントセレクションには、テーブルに実際に存在するよりも多くのレコードが含まれているように見える場合があります。
レコード番号
レコードには 3 つの番号が関連付けられています:
- レコード番号:レコード番号は、レコードの絶対的/物理的なレコード番号です。この番号は
Record numberコマンドによって返されます。 レコード番号は新しいレコードごとに自動的に割り当てられ、そのレコードが削除されるまで一定に保たれます。レコード番号はゼロから始まります。削除されたレコードのレコード番号は新しいレコードに再利用されるため、一意ではありません。また、データベースが 圧縮 または 修復 されると変化します。 - 選択されたレコード番号:選択されたレコード番号は、カレントセレクション内のレコードの位置であり、したがってカレントセレクションに依存します。セレクションが変更またはソートされると、選択されたレコード番号はおそらく変化します。選択されたレコード番号の番号付けは 1 から始まります。この番号は
Selected record numberコマンドによって返されます。 - シーケンス番号:シーケンス番号は、レコードのフィールドに割り当てることができる一意の反復しない番号です(自動インクリメント プロパティ、SQL の AUTO_INCREMENT 属性、または
Sequence numberコマンドを介して)。これは各レコードとともに自動的に格納されるわけではありません。デフォルトでは 1 から始まり、作成される新しいレコードごとにインクリメントされます。レコード番号とは異なり、シーケンス番号はレコードが削除されたときやデータベースが圧縮または修復されたときに再利用されません。シーケンス番号は、レコードに一意の ID 番号を持たせる方法を提供します。トランザクション中にシーケンス番号がインクリメントされた場合、トランザクションがキャンセルされてもその番号はデクリメントされません。
SET DATABASE PARAMETERコマンドを使用してテーブルの自動番号内部カウンターを変更する場合、4D は一切のチェックをおこないません。このカウンターをデクリメントすると、作成される新しいレコードにすでに割り当てられている番号が付く可能性があります。- レコードの一意の ID 主キーフィールドを埋めるためにシーケンス番号を使用することは推奨されません。一意のレコード ID を作成するには、UUID を使用することを強く推奨します。
レコードスタック
PUSH RECORD および POP RECORD コマンドを使用すると、レコードをレコードスタックに入れ(「プッシュ」)、スタックから取り除く(「ポップ」)ことができます。
各プロセスは、テーブルごとに独自のレコードスタックを持ちます。4D がレコードスタックを管理します。各レコードスタックは、後入れ先出し(LIFO)スタックです。スタックの容量はメモリによって制限されます。
PUSH RECORD と POP RECORD は慎重に使用する必要があります。プッシュされる各レコードは空きメモリの一部を使用します。あまりにも多くのレコードをプッシュすると、メモリ不足やスタックフルの状態が発生する可能性があります。
メソッドの実行終了時にメニューに戻ると、4D はポップされていないレコードをスタックから消去します。
PUSH RECORD と POP RECORD は、データ入力中に同じファイルのレコードを調べたい場合に便利です。これをおこなうには、レコードをプッシュし、ファイル内のレコードを検索して調べ(たとえばフィールドを変数にコピーするなど)、最後にレコードをポップして復元します。
レコードの入力中に複数フィールドの一意の値をチェックする必要がある場合は、SET QUERY DESTINATION コマンドを使用します。これにより、カレントレコードに入力されたデータを保持するために QUERY の呼び出しの前後でおこなっていた PUSH RECORD と POP RECORD の呼び出しが不要になります。SET QUERY DESTINATION を使用すると、セレクションもカレントレコードも変更しない検索をおこなうことができます。
レコードのロック
4D および 4D Server は、マルチユーザーまたはマルチプロセスの競合を防ぐことで、データベースを自動的に管理します。2 人のユーザーまたは 2 つのプロセスが同時に同じレコードやオブジェクトを変更することはできません。ただし、2 人目のユーザーまたはプロセスは、同時にそのレコードやオブジェクトへの読み取り専用アクセスを持つことができます。
マルチユーザーコマンドを使用する理由はいくつかあります:
- 言語を使用してレコードを変更する。
- マルチユーザー操作にカスタムユーザーインターフェースを使用する。
- 関連する変更をトランザクション内で保存する。
マルチプロセスのデータベースでコマンドを使用する際に注意すべき重要な概念が 3 つあります:
- プロセス内では、各テーブルは読み取り専用または読み書きのいずれかの状態にあります。
- レコードは読み込まれるとロックされ、解放されるとロック解除されます。
- ロックされたレコードは変更できません。
以降のセクションでは慣例として、マルチユーザーデータベースで操作をおこなう人物を ローカルユーザー と呼びます。データベースを使用する他の人々は 他のユーザー と呼びます。説明はローカルユーザーの視点からおこなわれます。同様に、マルチプロセスの観点からは、データベースで操作を実行しているプロセスを カレントプロセス と呼びます。他の実行中のプロセスは 他のプロセス と呼びます。説明はカレントプロセスの視点からおこなわれます。
ロックされたレコード
ロックされたレコードは、ローカルユーザーまたはカレントプロセスによって変更できません。ロックされたレコードは読み込むことはできますが、変更することはできません。レコードは、他のユーザーまたはプロセスの 1 つが変更のためにレコードの読み込みに成功したとき、またはレコードがスタックされているときにロックされます。レコードを変更しているユーザーだけが、そのレコードをロック解除された状態として見ます。他のすべてのユーザーおよびプロセスは、そのレコードをロックされた状態、したがって変更不可能な状態として見ます。レコードがロック解除された状態で読み込まれるためには、テーブルが読み書き状態にある必要があります。
読み取り専用状態と読み書き状態
データベース内の各テーブルは、データベースの各ユーザーおよびプロセスに対して、読み書き状態または読み取り専用状態のいずれかにあります。読み取り専用 とは、テーブルのレコードを読み込めるが変更はできないことを意味します。読み書き とは、他のユーザーが先にレコードをロックしていなければ、テーブルのレコードを読み込んで変更できることを意味します。
テーブルのステータスを変更すると、その変更は次に読み込まれるレコードに対して有効になることに注意してください。テーブルのステータスを変更したときに現在読み込まれているレコードがある場合、そのレコードはステータス変更の影響を受けません。
読み取り専用状態
テーブルが読み取り専用でレコードが読み込まれると、そのレコードは常にロックされます。言い換えれば、ロックされたレコードは表示、印刷、その他の方法で使用できますが、変更することはできません。
読み取り専用状態は既存のレコードの編集にのみ適用されることに注意してください。読み取り専用状態は新しいレコードの作成には影響しません。CREATE RECORD および ADD RECORD、またはデザイン環境のメニューコマンドを使用して、読み取り専用テーブルにレコードを追加することは依然として可能です(この場合、作成されるレコードは他のすべてのユーザー/プロセスに対してロックされます)。ARRAY TO SELECTION コマンドは、レコードの作成と変更の両方をおこなえるため、読み取り専用状態の影響を受けないことに注意してください。
4D は、レコードへの書き込みアクセスを必要としないコマンドに対して、テーブルを自動的に読み取り専用に設定します。これらのコマンドは次のとおりです:DISPLAY SELECTION、DISTINCT VALUES、EXPORT DIF、EXPORT SYLK、EXPORT TEXT、PRINT SELECTION、PRINT LABEL、QR REPORT、SELECTION TO ARRAY、SELECTION RANGE TO ARRAY。
Read only state 関数を使用して、いつでもテーブルの状態を確認できます。
これらのコマンドのいずれかを実行する前に、4D はカレントプロセスに対するテーブルの現在の状態(読み取り専用または読み書き)を保存します。コマンドの実行後、この状態は復元されます。
読み書き状態
テーブルが読み書きでレコードが読み込まれると、他のユーザーが先にレコードをロックしていなければ、そのレコードはロック解除されます。レコードが別のユーザーによってロックされている場合、そのレコードはロックされたレコードとして読み込まれ、ローカルユーザーは変更できません。
レコードがロック解除され、したがって変更可能になるためには、テーブルが読み書きに設定され、レコードが読み込まれている必要があります。
ユーザーが読み書きモードのテーブルからレコードを読み込むと、他のユーザーはそのレコードを変更のために読み込むことはできません。ただし、他のユーザーは、CREATE RECORD および ADD RECORD コマンドを介して、あるいはデザイン環境で手動で、テーブルにレコードを追加することができます。
読み書きは、データベースが開かれ新しいプロセスが開始されたときの、すべてのテーブルのデフォルト状態です。
テーブルのステータスの変更
READ ONLY および READ WRITE コマンドを使用して、テーブルの状態を変更できます。レコードを読み取り専用または読み書きにするためにテーブルの状態を変更したい場合は、このレコードが読み込まれる前にコマンドを実行する必要があります。すでに読み込まれているレコードは、READ ONLY および READ WRITE コマンドの影響を受けません。
各プロセスは、データベース内の各テーブルに対して独自の状態(読み取り専用または読み書き)を持ちます。
デフォルトでは、READ ONLY コマンドを使用しない場合、すべてのテーブルは読み書きモードになっています。
レコードの読み込み、変更、および解放
ローカルユーザーがレコードを変更できるようにするには、テーブルが読み書き状態にあり、レコードが読み込まれてロック解除されている必要があります。
カレントレコードを読み込むコマンド(存在する場合)— NEXT RECORD、QUERY、ORDER BY、RELATE ONE など — はいずれも、レコードの状態をロックまたはロック解除に設定します。レコードは、そのテーブルの現在の状態(読み取り専用または読み書き)と可用性に応じて読み込まれます。レコードは、自動リレーションを確立させる任意のコマンドによって、関連するテーブルに対して読み込まれることもあります。
テーブルがプロセスまたはユーザーに対して読み取り専用状態にある場合、このテーブルのレコードは読み取り専用モードで読み込まれます。つまり、このプロセスまたはユーザーによって変更または削除することはできません。これはデータの表示や取得に推奨されます。必要に応じて、他のユーザーやプロセスがこのテーブルのレコードに読み書きモードでアクセスすることを妨げないためです。
テーブルがプロセスまたはユーザーに対して読み書き状態にある場合、このテーブルの任意のレコードも読み書きモードで読み込まれますが、これは他のユーザーまたはプロセスがすでにこのレコードをロックしていない場合に限られます。レコードが読み書きモードで正常に読み込まれると、それはカレントプロセスまたはユーザーに対してロック解除され(変更して保存できます)、他のすべてのユーザーまたはプロセスに対してロックされます。変更のためにレコードを読み込んでから保存するには、その前にテーブルを読み書き状態にする必要があります。
レコードを変更する場合は、Locked 関数を使用して、レコードが別のユーザーによってロックされているかどうかをテストします。レコードがロックされている場合(Locked が True を返す)、LOAD RECORD コマンドでレコードを読み込み、レコードがロックされているかどうかを再度テストします。このシーケンスは、レコードがロック解除される(Locked が False を返す)まで続ける必要があります。
レコードに加える変更が完了したら、レコードを UNLOAD RECORD で解放する(したがって他のユーザーに対してロック解除する)必要があります。レコードが解放されない場合、別のカレントレコードが選択されるまで、他のすべてのユーザーに対してロックされたままになります。テーブルのカレントレコードを変更すると、以前のカレントレコードが自動的にロック解除されます。カレントレコードを変更しない場合は、明示的に UNLOAD RECORD を呼び出す必要があります。この説明は既存のレコードに適用されます。新しいレコードが作成された場合、それが属するテーブルの状態に関係なく保存できます。
トランザクション内で使用される場合、UNLOAD RECORD コマンドは、トランザクションを管理するプロセスに対してのみカレントレコードを解放します。他のプロセスに対しては、トランザクションが確定(またはキャンセル)されるまで、レコードはロックされたままになります。
LOCKED BY コマンドを使用して、どのユーザーおよび/またはプロセスがレコードをロックしたかを確認できます。
良い方法は、各プロセスの開始時にすべてのテーブルを読み取り専用モードにし(READ ONLY(*) 構文を使用)、必要なときにのみ各テーブルを読み書きモードにすることです。読み取り専用モードでのテーブルへのアクセスは、より高速でメモリ効率が高くなります。さらに、テーブルの状態の変更はクライアント/サーバーモードで最適化されています。これは、追加のネットワークトラフィックを発生させないためです。情報は、テーブルへの適切なアクセスを必要とするコマンドを実行するときにのみサーバーに送信されます。
ロック解除されたレコードを読み込むためのループ
次の例は、ロック解除されたレコードを読み込むための最もシンプルなループを示しています:
READ WRITE([Customers])//テーブルの状態を読み書きに設定
Repeat//レコードがロック解除されるまでループ
LOAD RECORD([Customers])//レコードを読み込みロック状態を設定
Until(Not(Locked([Customers])))
//ここでレコードに対して何かをおこなう
READ ONLY([Customers])//テーブルの状態を読み取り専用に設定
ループは、レコードがロック解除されるまで続きます。
このようなループは、レコードが他の誰かによってロックされている可能性が低い場合にのみ使用されます。そうでないと、ユーザーはループが終了するまで待たなければならないからです。したがって、レコードがメソッドによってのみ変更され得る場合を除き、このループがそのまま使用されることはまずないでしょう。
次の例は、前述のループを使用してロック解除されたレコードを読み込み、レコードを変更します:
READ WRITE([Inventory])
Repeat //レコードがロック解除されるまでループ
LOAD RECORD([Inventory]) //レコードを読み込みロック状態に設定
Until(Not(Locked([Inventory])))
[Inventory]Part Qty:=[Inventory]Part Qty 1 //レコードを変更
SAVE RECORD([Inventory]) //レコードを保存
UNLOAD RECORD([Inventory]) //他のユーザーが変更できるようにする
READ ONLY([Inventory])
MODIFY RECORD コマンドは、レコードがロックされている場合に自動的にユーザーに通知し、レコードが変更されるのを防ぎます。次の例は、まず Locked 関数でレコードをテストすることで、この自動通知を回避します。レコードがロックされている場合、ユーザーはキャンセルできます。
この例は、テーブル [Commands] に対してカレントレコードがロックされているかどうかを効率的にチェックします。ロックされている場合、プロセスはプロシージャによって 1 秒間遅延されます。この手法は、マルチユーザーの状況でもマルチプロセスの状況でも使用できます:
Repeat
READ ONLY([Commands])//今は読み書きは必要ありません
QUERY([Commands])
//検索が完了し、いくつかのレコードが返された場合
If((OK=1) & (Records in selection([Commands])>0))
READ WRITE([Commands])//テーブルを読み書き状態に設定
LOAD RECORD([Commands])
While(Locked([Commands]) & (OK=1)) `レコードがロックされている場合、
//レコードがロック解除されるまでループ
//レコードは誰によってロックされているか?
LOCKED BY([Commands];$Process;$User;$SessionUser;$Name)
If($Process=-1)//レコードは削除されたか?
ALERT("レコードはその間に削除されました。")
OK:=0
Else
If($User="")//シングルユーザーモードですか
$User:="あなた"
End if
CONFIRM("レコードはすでに "+$User+" によって "+$Name+" プロセスで使用されています。")
If(OK=1)//数秒待ちたい場合
DELAY PROCESS(Current process;120)//数秒待つ
LOAD RECORD([Commands])//レコードの読み込みを試みる
End if
End if
End while
If(OK=1)//レコードはロック解除されている
MODIFY RECORD([Commands])//レコードを変更できます
UNLOAD RECORD([Commands])
End if
READ ONLY([Commands])//読み取り専用に戻す
OK:=1
End if
Until(OK=0)
マルチユーザーまたはマルチプロセス環境でのコマンドの使用
言語内の多くのコマンドは、ロックされたレコードに遭遇したときに特定のアクションを実行します。ロックされたレコードに遭遇しなければ、通常どおり動作します。
以下は、これらのコマンドと、ロックされたレコードに遭遇したときのアクションのリストです。
MODIFY RECORD:レコードが使用中であることを示すダイアログボックスを表示します。レコードは表示されないため、ユーザーはレコードを変更できません。デザイン環境では、レコードは読み取り専用状態で表示されます。MODIFY SELECTION:ユーザーがレコードをダブルクリックして変更する場合を除き、通常どおり動作します。MODIFY SELECTIONはレコードが使用中であることを示すダイアログボックスを表示し、その後レコードへの読み取り専用アクセスを許可します。APPLY TO SELECTION:ロックされたレコードを読み込みますが、変更はしません。APPLY TO SELECTIONは、特別な注意なしにテーブルから情報を読み取るために使用できます。コマンドがロックされたレコードに遭遇した場合、そのレコードはLockedSetシステムセット に入れられます。DELETE SELECTION:ロックされたレコードは削除せず、スキップします。コマンドがロックされたレコードに遭遇した場合、そのレコードはLockedSetシステムセット に入れられます。DELETE RECORD:レコードがロックされている場合、このコマンドは無視されます。エラーは返されません。このコマンドを実行する前に、レコードがロック解除されていることをテストする必要があります。SAVE RECORD:レコードがロックされている場合、このコマンドは無視されます。エラーは返されません。このコマンドを実行する前に、レコードがロック解除されていることをテストする必要があります。ARRAY TO SELECTION:ロックされたレコードは保存しません。コマンドがロックされたレコードに遭遇した場合、そのレコードはLockedSetシステムセット に入れられます。GOTO RECORD:マルチユーザー/マルチプロセスのデータベースでは、レコードが他のユーザーによって削除および追加される可能性があるため、レコード番号が変わることがあります。マルチユーザーのデータベースで番号によってレコードを直接参照する場合は注意してください。- セット:セットには特に注意してください。セットの基になっていた情報が、別のユーザーまたはプロセスによって変更されている可能性があるためです。
レコードとリレーション
Relations テーマ のコマンド、特に RELATE ONE と RELATE MANY は、テーブル間の自動および非自動のリレーションを確立して管理します。このテーマのコマンドを使用する前に、テーブル間のリレーションの作成に関する情報については 4D デザインリファレンスマニュアルを参照してください。
コマンドで自動テーブルリレーションを使用する
2 つのテーブルは自動テーブルリレーションで関連付けることができます。一般に、自動テーブルリレーションが確立されると、関連するテーブル内の関連レコードを読み込むか選択します。多くの操作がリレーションの確立を引き起こします。
これらの操作には次のものが含まれます:
- データ入力
- 出力フォームでの画面上のレコードのリスト表示
- レポート作成
- 検索、ソート、数式の適用など、レコードのセレクションに対する操作
パフォーマンスを最適化するため、4D が自動リレーションを確立する際、テーブルに対してカレントレコードになるのは 1 件のレコードだけです。上記の各操作について、関連レコードは次の原則に従って読み込まれます:
- リレーションが関連テーブルの 1 件のレコードのみを選択する場合、そのレコードはディスクから読み込まれます。
- リレーションが関連テーブルの複数のレコードを選択する場合、そのテーブルに対して新しいレコードのセレクションが作成され、そのセレクションの最初のレコードがディスクから読み込まれます。
たとえば、ここに表示されているデータベースストラクチャーを使用すると、[Employees] テーブルのレコードがデータ入力のために読み込まれて表示される場合、[Companies] テーブルの関連レコードが選択されて読み込まれます。同様に、[Companies] テーブルのレコードがデータ入力のために読み込まれて表示される場合、[Employees] テーブルの関連レコードが選択されます。

このデータベースストラクチャーでは、[Employees] テーブルは N テーブル(Many)と呼ばれ、[Companies] テーブルは 1 テーブル(One)と呼ばれます。この概念を覚えるには、「1 つの会社に多数の従業員が関連している」および「各会社には多数の従業員がいる」と考えてください。
同様に、[Employees] テーブルの Company フィールドは N フィールド と呼ばれ、[Companies] テーブルの Name フィールドは 1 フィールドと呼ばれます。関連フィールドを一意にすることが常に可能とは限りません。たとえば、[Companies]Name フィールドには、同じ値を含む複数の会社レコードが存在する場合があります。この一意でない状況は、関連テーブルの別のフィールドに、常に一意となるリレーションを作成することで簡単に処理できます。このフィールドは会社 ID フィールドにできます。
次の表は、コマンドの実行中に自動リレーションを使用して関連レコードを読み込むコマンドの一覧です。すべてのコマンドは、既存の自動 N 対 1 リレーションを使用します。下記の「1 対 N 確立」列に「はい」があるコマンドのみが、自動 1 対 N リレーションを使用します。
| コマンド | 1 対 N 確立 |
|---|---|
ADD RECORD | はい |
APPLY TO SELECTION | いいえ |
DISPLAY SELECTION | いいえ |
EXPORT DIF | いいえ |
EXPORT SYLK | いいえ |
EXPORT TEXT | いいえ |
EXPORT DATA | いいえ |
MODIFY RECORD | はい |
MODIFY SELECTION | はい(データ入力時) |
ORDER BY | いいえ |
ORDER BY FORMULA | いいえ |
QUERY BY FORMULA | はい |
QUERY SELECTION | はい |
QUERY | はい |
PRINT LABEL | いいえ |
PRINT SELECTION | はい |
QR REPORT | いいえ |
SELECTION TO ARRAY | いいえ |
SELECTION RANGE TO ARRAY | いいえ |
コマンドを使用してテーブルリレーションを確立する
自動リレーションは、コマンドがレコードを読み込むだけで、テーブルの関連レコードが選択されることを意味するわけではありません。場合によっては、レコードを読み込むコマンドを使用した後、関連データにアクセスする必要があるときは、RELATE ONE または RELATE MANY を使用して関連レコードを明示的に選択する必要があります。
前述の表に記載されているコマンドの一部(検索コマンドなど)は、タスクの完了後にカレントレコードを読み込みます。この場合、読み込まれたレコードは、それに関連するレコードを自動的に選択しません。この場合も、関連データにアクセスする必要があるときは、RELATE ONE または RELATE MANY を使用して関連レコードを明示的に選択する必要があります。