Tips

リレートされたテーブルの扱い

日付2009/02/02
ID09-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つあります。

  1. FROM句に利用するテーブルを全て記述
  2. WHERE句で検索条件に加えてリレーション関係を記述

SQLでは、柔軟な表を作成することができますが、4Dランゲージとは違いリレート関係をSQL文の中で記述しなければなりません。SQLのJOINについては4D SQLリファレンスに記載がありますので、そちらをご参照ください。

4D SQL リファレンス/チュートリアル:
http://www.4d.com/docs/CMJ/CMJ18432.HTM