【FileMaker】FileMakerで差分クエリチックに表示 - 対象外のみを表示

請求書に該当する納品書番号が全て入っているか？入っていないものはあるか？という、いわゆる差分チェックについてです。
Accessでは「[差分クエリ](https://support.office.com/ja-jp/article/2-%E3%81%A4%E3%81%AE%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%82%92%E6%AF%94%E8%BC%83%E3%81%97%E3%80%81%E4%B8%80%E8%87%B4%E3%81%99%E3%82%8B%E3%82%82%E3%81%AE%E3%81%8C%E3%81%AA%E3%81%84%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B-cb20ad48-4eba-402a-b20d-eaf10a5d1cb4)」というやつですね。
ちなみにAccessは触ったことありますが詳しくやってません。

では、やっていきましょう。

# 用意するもの
サンプルとして、「納品書」「請求書」テーブルを用意しました。
<img width="837" alt="スクリーンショット 2020-02-23 23.01.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/76e06ab4-86d2-f1da-2dba-59cd821de4e3.png">
単純化するために、フィールドを同一にしてあります。

# リレーションシップ
これらのリレーションシップを構築しておきます。
<img width="433" alt="スクリーンショット 2020-02-23 22.54.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/e366fa14-186e-2f11-fe6c-65de72f9964e.png">
今回は納品書番号と請求書番号が一致するもの、というリレーションシップです。

# テストデータ
納品書には6件、請求書には4件のデータがあります。
ここでの例として、「請求書テーブルに納品書全ての納品書番号があるかどうかを確認する」ことにします。
<img width="726" alt="スクリーンショット 2020-02-23 23.04.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/9b097a27-10bb-0a4f-7c58-5cc704927ae2.png">
このテストデータでは、目視で2件、請求書に入っていませんね。

# スクリプト
では、これを検出するスクリプトです。
<img width="911" alt="スクリーンショット 2020-02-23 22.56.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/711e422b-3386-caed-82a1-26bb124aa34f.png">
画像のコメントにもありますが、要は、請求書からみて納品書に過剰にあるものをリストアップする、という内容をスクリプトにします。
このスクリプトが正常に動くには、リレーションシップグラフで「=」でnoDataをリレーションシップしてあることが大前提です。
この同一のnoDataを抽出したのち、「それ以外を表示してくれ」と最後の行で指定するわけです。

#実行してみる
はい、無事請求書にない納品書をリストアップできました。
<img width="377" alt="スクリーンショット 2020-02-23 22.56.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/131d1074-6dad-474a-2f55-4196d86fd82c.png">

#できれば両方並べて表示したい
やりたいですよねぇ。。。
その方が見た目わかりやすいですし。

※ここから先は、FileMaker Pro Advanced 17以降の「「マスタ/詳細レイアウトのポータル」機能を利用して作成しています。それ以前のバージョンの場合は、自己リレーションシップを構築して同様の動きが実装可能です。また、納品書テーブルのリストのみを表示する場合は、特に自己リレーションシップの構築は不要です。

ということで、こんな感じでどうでしょう？
まず、納品書テーブルに「なかったよ」フラグを追加します。
<img width="402" alt="スクリーンショット 2020-02-23 23.20.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/e68224c7-2d6d-97a4-ea8f-7a7ffd064bbf.png">

次に、差分リストを表示するレイアウト用にリレーションシップを構築します。
先ほどの「=」のテーブルオカレンスを利用すると対象のものしか表示しませんので、ここではあえて「[照合フィールドの値に関係なく、左側のテーブルのすべてのレコードを右側のテーブルのすべてのレコードに一致させる](https://fmhelp.filemaker.com/help/18/fmp/ja/index.html#page/FMP_Help/relationships-comparative-operators.html)」意味の「x」でリレーションします。

<img width="391" alt="スクリーンショット 2020-02-23 23.20.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/9783e709-49f1-b63d-24bd-be34659c6096.png">

新規で作ったリレーションシップを使って、レイアウトを作成します。
<img width="938" alt="スクリーンショット 2020-02-23 23.20.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/4e156032-cdaf-eb5c-d821-f97156101089.png">
フラグがついているのがわかりやすいように、条件付き書式を設定しておきます。
<img width="997" alt="スクリーンショット 2020-02-23 23.21.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/bc5f835a-e286-2b4b-9ac6-27fab2345c73.png">

スクリプトは、先ほどのスクリプトに3行追加します。
抽出された対象外レコードにフラグを一括で設定し、差分リストを構築したレイアウトを表示します。
<img width="871" alt="スクリーンショット 2020-02-23 23.36.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/9a972cdb-40de-a6f7-d4c7-c8e089458084.png">
繰り返し実行する場合は、先にフラグのクリアも実行しておきます。（上記スクリプト３行目）

こんな感じで表示されます。
<img width="882" alt="スクリーンショット 2020-02-23 23.39.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/0590b0c4-b458-508a-20a5-996b4899525a.png">

差分チェック、Accessようにウィザードがあるわけではありませんが、この数行のスクリプトで同じようなことができますので、ぜひやってみてください。

#追記 2020/02/26
サンプルファイルをGithubへアップしてあります。
[FileMaker Sample](https://github.com/atsukosekiguchi/FileMakerSample)
上記サイトから、"Sample_DefferenceQuery.fmp12"をダウンロードしてください。