リレートされたテーブルの扱い
日付 | 2009/02/02 |
---|---|
ID | 09-019 |
バージョン | 11 |
プラットフォーム | Win & Mac |
はじめに
4Dのリレートは、複数のテーブルを連携させて利用できる機能です。このリレートにはマニュアルリレートと自動リレートがあります。
自動リレートがコマンド実行後にカレントセレクションやカレントレコードのロードについて、自動的に働くと勘違いされることがあります。実際、自動リレートであれば、表示や印刷時にリレート先の関連するレコードが、表示されたり印刷されるようになります。しかし、自動リレートは基本的に4Dのコマンド内部で利用されるもので、メソッドでの利用の場合には、明示的な記述を行わなければリレートされたテーブルのセレクションが自動的に作成されたり、レコードがロードされることはありません。この動作の詳細は、ランゲージリファレンスに記載されています。
リレートコマンド:
http://www.4d.com/docs/CMJ/CMJ10059.HTM
4Dランゲージ
コマンドでリレートを扱う時には、自動リレートである必要はありません。その代わりリレートコマンドで明示的にリレートを使う必要があります。
上記のようなデータベースの場合、Companiesテーブルを検索して、関連したEmployeesテーブルをセレクションにまとめる為には、次のようにRELATE MANYを明記しなければなりません。
QUERY([Companies];[Companies]Name=$FindKey) RELATE MANY([Companies]Name)
上記のコードでは、リレートが自動であるかマニュアルであるかは重要ではありません。しかし次のようなコードを実行するとき、表示される画面では自動リレートが使われるので、リレートが自動であることは重要な意味を持ちます。
QUERY([Companies];[Companies]Name=$FindKey) DISPLAY SELECTION([Companies])
SQL
SQLの場合、4Dのリレートは意味を持ちません。例えば次のコードは、ある会社の従業員を検索しますが、リレートが存在しなくても正しいセレクションを作成します。
SET DATABASE PARAMETER(QUERY BY FORMULA Joins ;2) `Activate SQL joins QUERY BY FORMULA([Employees];([Employees]Company=[Companies]Name) & ([Companies]Name=$FindKey))
注目していただきたいのは、QUERY BY FORMULAが4Dのコマンドでありながら、SQLのエンジンを利用していることです。SET DATABASE PARAMETERでQUERY BY FORMULA Joinsのセレクタの値を2に設定すると、QUERY BY FORMULAコマンドでSQLのJOINを利用して検索することができるようになります。その結果、上記のコードがリレート無しで正しく動作することになります。
4DのJOIN句は省略された形でのみ記述できます。4DではJOINは常にCROSS JOINとして働きます。次のコードは、ある会社の情報と従業員のリストをリストボックスに表示します。
Begin SQL SELECT * FROM Companies,Employees WHERE Employees.Company = Companies.Name AND Companies.Name = :$FindKey INTO :ListBox1; End SQL
SQLでJOINを利用するポイントは、2つあります。
- FROM句に利用するテーブルを全て記述
- WHERE句で検索条件に加えてリレーション関係を記述
SQLでは、柔軟な表を作成することができますが、4Dランゲージとは違いリレート関係をSQL文の中で記述しなければなりません。SQLのJOINについては4D SQLリファレンスに記載がありますので、そちらをご参照ください。
4D SQL リファレンス/チュートリアル:
http://www.4d.com/docs/CMJ/CMJ18432.HTM