ToDoリストや案件管理などをしていると、「親子関係のあるデータを、階層構造のように一覧表示したい」と思うことは多いはずです。FileMakerではテーブル同士をリレーションでつなぐことで関連レコードを表示できますが、同じテーブルの中で「親」と「子」をつなぎたい場合は、少しコツが必要になります。
この記事では、同じテーブル同士を結びつける「自己連結リレーション」を使って、親子構造をポータルで表示する方法を、できるだけ専門用語を控えながら解説します。
自己連結リレーションとは?イメージをつかもう
自己連結リレーションとは、ひとつのテーブルを、あたかも別のテーブルのように見立てて、自分自身とリレーションを張ることです。
例えば、テーブル名が「タスク」で、次のようなフィールドがあるとします。
- ID(タスクを一意に識別する番号)
- 親ID(親タスクのIDを入れるフィールド)
- タスク名
「親ID」に「親になるタスクのID」を入れておくと、「親ID=1のレコードは、ID=1のレコードの子ども」という関係を作れます。
この「ID」と「親ID」を自己連結リレーションでつなぐことで、「あるタスクの子タスク」をポータルで表示できるようになります。
データ構造を準備する:最低限そろえたいフィールド
まずは、親子構造を表現するためのフィールドを用意します。すでにある場合は確認だけで構いません。
- IDフィールド
自動入力の連番やUUIDなど、レコードごとに固有になる値を入れます。 - 親IDフィールド
このレコードの親になるレコードのIDを入れます。親がいない場合(最上位のレコード)は空白にします。 - 名前(タイトル)フィールド
プロジェクト名やタスク名など、画面に表示したい名称です。
ポイントは、「ID」と「親ID」の2本立てで親子関係を表す、という考え方です。これが自己連結リレーションの「つなぎ目」になります。
リレーションシップグラフで自己連結リレーションを作成
次に、リレーションシップグラフで同じテーブルを二つに見せて、親と子をつなぎます。
- 管理画面を開く
「ファイル」メニューから「管理」→「データベース」を開き、「リレーションシップ」タブを表示します。 - テーブルオカレンスを複製する
リストにある元のテーブル(例:タスク)を右クリック(Macの場合はコンテキストメニューを表示)して「複製」を選びます。
複製した方に、分かりやすい名前(例:タスク_子)を付けます。 - 自己連結リレーションを設定する
元のテーブルオカレンス(例:タスク)から「ID」フィールドを、複製したテーブルオカレンス(タスク_子)の「親ID」フィールドへドラッグして結びます。
これで「タスク::ID = タスク_子::親ID」という自己連結リレーションが完成します。
ここでのイメージは、「左側のタスクは親、右側のタスク_子はその子どもたち」という関係です。
レイアウトにポータルを置いて子レコードを表示する
自己連結リレーションができたら、次はレイアウト上にポータルを配置します。
- 親レコード用レイアウトを開く
元のテーブルオカレンス(タスク)を元にしたレイアウトを作るか、既存のレイアウトを開きます。 - レイアウトモードに切り替え
ステータスツールバーから「レイアウトモード」に切り替えます。 - ポータルツールを配置
ツールバーから「ポータルツール」を選択し、レイアウト上にドラッグして領域を作ります。 - ポータル設定で自己連結先を選ぶ
表示するテーブルオカレンスとして、自己連結した側(例:タスク_子)を選択します。 - ポータルで表示するフィールドを選ぶ
タスク_子::タスク名 や タスク_子::ID など、子レコードとして見せたいフィールドをポータルの中に配置します。
これで、親タスクのレコードを表示したときに、そのレコードのIDと「親ID」が一致する子タスクが、ポータル内に一覧表示されます。
実際の操作イメージ:親子を登録してみる
具体的な登録の流れは次のようになります。
- 親タスクを新規作成
レイアウトで新規レコードを作り、タスク名(例:「Webサイト制作」)を入力します。
このときIDは自動入力されます(例:ID=1)。親IDは空白のままにします。 - 子タスクをポータルから追加
同じレイアウト上のポータル内で、新規行にカーソルを置いてタスク名を入力します(例:「トップページデザイン」)。
親IDには、自動的に親レコードのID(例:1)が入るようにフィールドの「入力値の自動化」で設定しておくと便利です。 - 結果を確認
親タスクのレコード1を見ると、その子タスクがポータル一覧に表示されているはずです。
親レコードを切り替えると、そのレコードに紐づく子タスクだけがポータルに表示されるため、親子構造が自然に把握できます。
応用のヒント:多階層や並び順にも対応できる
基本の自己連結リレーションが作れたら、次のような応用も可能です。
- 多階層の管理
子タスクもさらに子どもを持たせることで、階層を深くしていくことができます。
画面上は1段目だけポータル表示し、2段目以降は別レイアウトやスクリプトで切り替えるなどの工夫が必要です。 - 表示順の制御
タスク_子側に「並び順」フィールドを作り、ポータルのソート設定でそのフィールドを使うと、表示順を自由に並べ替えることができます。 - 集計や条件付き表示
完了フラグなどのフィールドを作り、完了していないタスクだけ表示する、といった条件付きポータルも可能です。
まとめ:自己連結リレーションで「つながる一覧」を作る
自己連結リレーションを使うと、同じテーブル内で親と子を結びつけて、直感的な「親子構造ポータル」を作ることができます。
- 同じテーブルを「親」と「子」に見立ててリレーションを張る
- 「ID」と「親ID」の2つのフィールドで親子関係を表現する
- 親側のレイアウトに、子テーブルオカレンスを元にしたポータルを置く
この仕組みを覚えておくと、タスク管理だけでなく、部門と社員、カテゴリと商品など、さまざまな場面で応用できるようになります。まずはシンプルな親子構造から試して、徐々に階層や機能を増やしていくと、迷わずに設計していけるはずです。