ココがポイント
今一つ初心者から脱してない状況からの疑問をテストしながらやってみようと思います。
テーブルの値を別のテーブルから参照できる機能がデータベースにはありますが、FileMakerProの場合の仕様がよくわかっていません。
ルックアップ値を設定
まずは、別テーブルの値を「ルックアップ値」と言う機能で引っ張ってくるテストをやってみたいと思います。
まず、テストファイルを作成して、2つのテーブルを準備しました。
それぞれのテーブルのフィールド構成は下記のようにしました。
ハウスキーピングフィールド
勝手に主キーから、修正者までのフィールドは、「ハウスキーピングフィールド」と言われるらしいです。
昔のFileMakerでは、自動で付加されなかったようですが、最近のFileMakerでは勝手に追加されています。
フィールド内容を見ると、複数ユーザーでログインして使用するケースなどには必要なフィールドのようですが、スタンドアロンで一人で使用する場合には必要の無いフィールドかもしれません。
ハウスキーピングフィールドを作成したくない場合は下記のサイトのような事をすればいいらしい。
ちょっと勉強になったので、ブログにしてみました。
ルックアップ値の設定
購入履歴テーブルの商品番号から、商品名と単価を商品マスタから引っ張ってきたい。
ココに注意
どうもリレーションを設定しないとダメみたいです!
まずは、更新や削除、ソート関係のチェックはしないでリレーションを設定しました。
※後で、このチェックの解説してあります。
商品マスタに適当なものを入力して準備しました。
この状態から、購入履歴の商品番号を入力してみました。
商品番号に入力すると、自動で商品名が出るようになりました。
同じ様にして、単価も自動で出るようにしました。
参考
購入履歴のルックアップ値設定したフィールドは、商品番号を入力すると、自動で商品名が入力されますが、その商品名を修正しても、商品マスタのが修正されることはありません。
ルックアップ値の機能は、商品番号が入力されて初めて、商品名が検索されて入力されるという動作になります。
※商品マスタからのリンクフィールド(参照フィールド)なら購入履歴からでも修正が可能となります。
合計の設定(フィールドタイプ)
次に、合計も自動で出そうと思い「計算値」というのにチェックを入れて、式を入れました。
ココに注意
しかし、計算されません!
フィールドのタイプ設定にて、「計算」にしたら自動計算されるようになりました。
その他の違いは下記のようになるようです。
選択するタイプ | フィールドデータの内容 |
テキスト | 各フィールドの繰り返しに対して、テキストとして使用される最大 2 GB までの文字、記号、または数字、あるいはこれらすべて。これは、RAM とディスクの空き容量によって制限されます。テキストフィールドについてを参照してください。 |
数字 | 数字または他の文字から成る値、および同じ範囲の負の値。数字フィールドについてを参照してください。 |
日付 | 日付のみ。日付フィールドについてを参照してください。 |
時刻 | 時刻のみ。時刻フィールドについてを参照してください。 |
タイムスタンプ | 暦の特定の日時を参照する日付と時刻。タイムスタンプフィールドについてを参照してください。 |
オブジェクト | ピクチャ、PDF、オーディオファイル、ビデオファイルなど任意のタイプのファイル。オブジェクトフィールドについてを参照してください。 |
計算 | 現在のレコードまたは関連レコードのフィールド値を使用する計算式の計算結果。計算フィールドの定義を参照してください。 |
集計 | 同じテーブル内にある複数のレコードのフィールド値を集計して得られた値。集計フィールドの定義を参照してください。 |
ちょっと「計算」と「集計」の違いが微妙ですが、
ココがポイント
「計算」は、現レコード内だけの計算であり、「集計」は、テーブル全体の集計って事ですね。
当たり前の事ですが、集計の方は、レコードを移動させても、全部同じ数値になります。
リレーションシップ
レイアウトに別テーブルフィールドを追加
この仕様も当たり前なのかもしれませんが、「購入履歴」テーブルからレイアウトを準備して、「商品マスタ」から、商品名と金額を追加してみました。
一覧表示にすると、「::」というのが、別テーブルからのリンク表示の意味のようです。
別テーブルのフィールドがリンクできるなら、元テーブルのフィールドを消してもいい!?
ココがポイント
リレーションを組んであれば、別テーブルからフィールドをリンクさせれば元テーブルのフィールドが必要なくなる
データベースを組むうえでレコード数が増えていくと処理速度を考えなければなりませんが、フィールド数を減らす事で処理速度が速くなるなら、リンクフィールドのような感じで組んで行った方が良いのかもしれません。
ちょっと調べても答えが見つからなかったので何とも言えません。
※非保存の計算フィールドがあると、その都度計算するので、処理速度には影響あるようです。
1対1、1対多(多対1)、自己連結
リレーションシップには、3種類あるようですが、よく理解できなですね。
Clarisのホームページをみると下記のようになっています。
リレーションシップのタイプ | 説明 |
1 対 1 | テーブル内の 1 つのレコードが別のテーブルの 1 つのレコードのみと関連付けられます。1 対 1 のリレーションシップを参照してください。 |
1 対多または多対 1 | テーブル内の 1 つのレコードを別のテーブルの 1 つ以上のレコードと関連付けることができます。または、テーブル内の 1 つ以上のレコードを別のテーブルの 1 つのレコードと関連付けることができます。1 対多のリレーションシップを参照してください。 |
自己連結 | 両方の主キーが同じテーブルの 2 つのオカレンスで定義されます。自己連結リレーションシップを参照してください。 |
今回自分がテストで作成したテーブルのリレーションシップは、多対多ですが、例えば、1対多にするには、どうしたらいいのでしょうか?
ココがポイント
片方のフィールド設定をユニークキーに変更すればできました!
リレーションシップのチェックボックス
このテーブルごとに3選択はどんな時に使うのでしょうか?
分かるような分からないような・・・
実際に実験をしてみることにしました。
●リレーションシップの方は、商品マスタ(商品番号)1に対して、購入履歴(商品番号)多の設定
(Q1)商品マスタ(このリレーションシップを使用して、このテーブルの作成を許可)にチェックした時、購入履歴に商品番号を追加。
(A1)商品マスタには、何もレコードは追加されませんでした。
(Q2)商品マスタ(他のテーブルでレコードが削除された時、このテーブルの関連レコードを削除)にチェックした時、購入履歴からレコードを削除。
(A2)商品マスタから同じ商品番号のレコードが削除されました。
(Q3)上記の設定の状態にて、商品マスタにレコード追加。
(A3)購入履歴には何も追加されませんでした。
(Q4)上の設定の状態にて、商品マスタのレコード削除
(A4)商品マスタのみ消え、購入履歴のレコードは削除されない。
(Q5)購入履歴(このリレーションシップを使用して、このテーブルの作成を許可)にチェックした時、購入履歴に新しい商品番号を追加。
(A5)商品マスタには、何もレコードは追加されませんでした。
(Q6)購入履歴(他のテーブルでレコードが削除された時、このテーブルの関連レコードを削除)にチェックした時、購入履歴からレコードを削除。
(A6)商品マスタから同じ商品番号のレコードは削除されませんでした。※商品マスタのチェックは外してあります。
(Q7)購入履歴(他のテーブルでレコードが削除された時、このテーブルの関連レコードを削除)にチェックした時、商品マスタからレコードを削除。
(A7)購入履歴の同じ商品番号のレコードは削除されました。
1対多の場合、1の方にて、レコードを消せば、多の方にてキーが一致するレコードが全て削除されました。
1の方にて、「他のテーブルでレコードが削除された時、このテーブルの関連レコードを削除」にチェックした時に、多の方から消すと、1の方にてキーが一致するレコードが削除されました。※多のレコードが複数同じキーがある場合は、1つのレコードを消すと、多の同じキーを持つレコードも同時に削除されました。
どうも、「このリレーションシップを使用して、このテーブルの作成を許可」の意味が分からずテストしてようやくわかりました。
商品マスタに、購入履歴から参照フィールドを持ってきて、購入数を追加しようとすると、入力できずに何も反応しません。
ところが。「このリレーションシップを使用して、このテーブルの作成を許可」にチェックを入れると、入力することが可能となります。
ココがポイント
1のレイアウトから多の参照フィールドに値を入れた時に自動でレコードが追加されました。
たぶん、1対1のリレーションシップなら、1レコード追加すれば、他のテーブルにも1レコード追加されるという感じだと思います。
大まかに使いそうなリレーションシップだけ調べてみました。
ポータルとリレーションシップ
ポータルもリレーションシップによってキーを設定しているようです。
リレーションシップを設定していない状態では、ポータルには何も表示されることはありません。