【FileMaker】フィールド値の自動入力オプション：ルックアップと計算値の使い分け勘所

何年もFileMakerで開発してますが、今回初めて、ユーザ同士の会に参加しました。バクバクバク。。。
[FMルーキーズ会 第2回](https://fm-rookies.connpass.com/event/162740/)
その中ででた会話で、「ルックアップと計算値、違いは？」「どっちが速い？」など出ました。
ちょっと面白かったので、会のスタッフに了承を得て今回の記事に起こしました。

今回は、ルックアップと計算値の使い分け勘所とtwitterでコメントついたのでタイトルパクりました。

# フィールド値の自動入力って何？
テーブル設計をするときに、フィールドを作って初期値を設定する場面を考えてください。
例えば、売上書を作成するときに、商品コードを入力したら（もしくは商品画像をクリックしたら）商品マスタに登録してある商品名とか単価が自動的に入ってくれると嬉しいな、、、と考えたことありませんか？
FileMakerなら、設定だけでできます。
スクリプト書きません。（厳密には設定で書くこともありますが）

# ルックアップと計算値ってどういうこと？
この自動入力を実現する方法として、フィールド設計で
・[ルックアップ](https://fmhelp.filemaker.com/help/18/fmp/ja/index.html#page/FMP_Help/lookups.html)
・[計算値設定](https://fmhelp.filemaker.com/help/18/fmp/ja/index.html#page/FMP_Help%2Fautomatic-data-entry.html)
を紹介します。
詳しい説明はリンク先に任せます。
他にも計算フィールドにするとか、値を指定するなどあります。
（いつも思うけど、文字ばっかりじゃなくて図も交えてヘルプページを構成して欲しい）

# サンプルを作ってみる
今回はルーキーズ発信ということで、手を動かして自分で確認してみましょう。
動きだけを確認したい人は、作るを飛ばしてください。

## テーブルとフィールドを作る
新規ファイルを作成したら、メニューの「ファイル」＞「管理」＞「データベース」をクリックして必要なテーブルなどを作成します。

![スクリーンショット 2020-02-09 19.38.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/1be7dcf4-b90a-031a-c24f-5e27bc03d642.png)

では、テーブルを2つ作ります。
一つ目はトランザクションファイルになるので名前はなんでもいいです。
二つ目は、マスタファイルになるので、ここでは「マスタデータ」としています。
![スクリーンショット 2020-02-09 19.39.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/aa085d76-c4d5-f795-769d-e8369e40c520.png)

トランザクションファイルの構成です。
今回のサンプルでは、入力するフィールドは赤ワクで囲った２フィールドで十分です。
もう一つ、マスタデータを参照する「マスタキー」を作成します。
![スクリーンショット 2020-02-10 17.03.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/4a20ddf5-460a-597b-7ac9-c70a9f0b6230.png)

まずはフィールドだけを作ります。
ルックアップや計算値設定は次に説明する「リレーションシップ」を作らないと設定できません。

マスタデータファイルの構成です。
![スクリーンショット 2020-02-10 16.12.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/6ad2d51b-d094-a4bf-ffd2-9e4bf9b05bfb.png)
マスタデータファイルには、「名前」フィールドを追加します。
もし、お使いのFileMakerのバージョンが12〜16の場合は、これに「主キー」を追加してください。
![スクリーンショット 2020-02-10 16.16.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/023de67f-0321-6125-a95e-32e251016867.png)

## リレーションシップを作る
リレーションシップタブで、トランザクションデータの「マスタキー」とマスタデータの「主キー」でリレーションシップを作ります。
![スクリーンショット 2020-02-09 19.43.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/098a1472-c26d-6f5e-e107-ec5a467c56ea.png)
このリレーションシップを構築して、初めてルックアップなどの設定ができますので、順序を間違えずに進めていきましょう。

## ルックアップや計算値を設定する
トランザクションデータのフィールドで、それぞれルックアップと計算値を設定していきます。

### ルックアップをするフィールド
ルックアップでマスタデータからマスタコードに合致するレコードの「名前」を取得する設定です。
ここでは、マスタコードがマスタデータに存在しなかった場合、「名前」の代わりに「 *** NONE *** 」を設定します。
![スクリーンショット 2020-02-09 19.40.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/42ba8327-a09b-4d8e-7a47-287785526df1.png)

### 計算値で値を設定するフィールド
フィールド設定の「計算値」行にある「設定」をクリックしてマスタデータの名前が設定されるように指定します。
![スクリーンショット 2020-02-09 19.40.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/e24414b9-2cc7-d10f-d349-8a9301d8264c.png)

設定は、ここまでです。

# マスタデータを作成する
レイアウトを「マスタデータ」にして、マスタデータを入力します。
![スクリーンショット 2020-02-09 19.46.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/1f5cafed-6b99-3caa-61ee-03b089449996.png)
レイアウトの表示方法を表形式にしたときにフィールドが表示されていなかった場合は、ウィンドウ右にある「変更」からフィールドを指定して表示させます。
![スクリーンショット 2020-02-09 19.46.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/adb7ac32-c1da-7d27-1abb-da0672e8e468.png)
サンプルなので、名前はなんでもいいです。

# トランザクションで入力してみる
マスタデータの準備ができたので、実際にトランザクションデータでどのようにルックアップと計算値が設定されるかを確認していきましょう。
マスタデータの時と同様に、レイアウトを表形式にしたときにフィールドが羅列されていなかった場合は、「変更」ボタンで赤ワク部分のフィールドを追加します。
![スクリーンショット 2020-02-10 17.28.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/a8fbec6b-c05f-ee66-4e1e-a3c0e0b72213.png)

## 存在するマスタキーを指定する
新規レコードを作成します。
![スクリーンショット 2020-02-10 17.31.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/6a8cb374-73e8-4eef-23e7-16064d590378.png)

マスタキーのフィールドに、マスタデータで作成した主キーを入力し、フィールド外をクリックします。
![スクリーンショット 2020-02-10 17.31.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/54e97ead-eff0-7fae-aab0-2fc462a715b2.png)

ルックアップした名前と、計算値で設定した名前がそれぞれ自動で入力されたことがわかります。
![スクリーンショット 2020-02-10 17.46.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/6381f92d-07c2-54d3-ec5c-9df32e9cc3ad.png)

こうして見ると、どっちで設計してもいいんじゃないか？となりますが、次のマスタキーが存在しなかったときの動きで違いがわかります。

## 存在しないマスタキーを指定する
次に、新規レコードを作り、マスタデータに存在しない主キーを適当に指定します。
![スクリーンショット 2020-02-10 17.47.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/df6c63a5-23b2-a29b-a938-bf5385133bf1.png)

ルックアップの方は、設計で指定した「なかった時の設定」で指定した文字列が自動入力されていますが、計算値のところには、存在しないので何も設定されません。
![スクリーンショット 2020-02-10 17.47.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/9390992f-2dc9-2505-b742-fade0b70c1c0.png)

# ルックアップで「完全に一致する値がない場合」の設定の使い道は？
例えば、マスタキーを指定して、本当に自動入力されたのか本当にマスタにデータが存在しないキーを指定してしまったのか、という見分けができたりします。
ぱっと見、「ここのデータおかしい」ということがわかりやすくなります。
逆に、ルックアップでキーが存在しなかった時の設定で「使用する値」にしていながら何も値を設定しない、ということにしてマスタキーを設定しても値がない時にスクリプトなどでなんらかの処理をしたい場合で使えたりします。
スクリプトの条件文(if文)で、「isEmpty(＜テキストフィールド>)、、、」としてデータが存在しない場合の細々とした処理を書く、、、などです。

# ルックアップと計算値、どっちを使えばいいの？
ですよね〜。
わたし的には、次のように使い分けています。
・単純にキーを指定してマスタデータを持ってきたい場合 → ルックアップ
・リレーションシップでデータを持ってきたいけれど、条件わけをしてデータを持ってきたい場合 → 計算値
・単純に固定値を設定したい場合 → 計算値

ルックアップを使うそのほかの理由として、例えば見積書テーブルから請求書テーブルにデータをコピーしたい場合、スクリプトでのフィールド設定を書く手間を減らしたいというのもあります。
キーとなる値の設定をスクリプトに書けば、そのほかのフィールドはルックアップ設定するだけですので、開発時間も少なくなりますし、スクリプトのメンテナンスも少なくて済みます。

どっちを使うかというのは、開発者や会社の開発規則にも寄ると思いますが、今回のサンプルを通して使い勝手を検証してみるのもいいですね。

今回は、単純なサンプルですが、ルックアップと計算値の使い分けについてをお送りしました。