FileMakerProのOnFirstWindowOpenスクリプトトリガ実行時の不思議な挙動

# はじめに
## 前書き
* この記事は [FileMaker Advent Calendar 2020](https://qiita.com/advent-calendar/2020/filemaker) 17 日目の記事です。

## 対象読者
* [Claris FileMaker Pro](https://www.claris.com/ja/filemaker/) ユーザー
* スクリプトトリガで [OnFirstWindowOpen](https://help.claris.com/ja/pro-help/content/onfirstwindowopen.html) を使っている／今後使おうと考えている人

## 検証環境
* Windows 10 Pro ローカル環境
    * FileMaker Pro 19.1.3.315
    * FileMaker Pro 18.0.3.317

# 準備
## ファイルの準備
* 以下二つのファイルを用意します
    * A.fmp12
    * B.fmp12

## A.fmp12
### フィールドの用意
* 何でもよいのでフィールドを一つ作成
    * この段階で `B.fmp12` ファイルのフィールドも同じように用意

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/9041bb9d-3891-2427-f37a-bc8448dedb69.png)

* ブラウザモードで値を入れておく
    * `B.fmp12` ファイルの方にも値を入れておく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/1fbfd0f8-cb07-c1ba-15fe-364baca21d5a.png)


### リレーションシップ
* 外部データソースとして `B.fmp12` ファイルを登録して `any` 条件でリレーションを結ぶ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/42ff2f5b-c6fd-3e36-de17-1a9e95a69a02.png)


### スクリプトの作成
* 以下のように `B.fmp12` ファイルで作成した `return_global_var` スクリプトを実行し、その結果を受け取ってカスタムダイアログで表示するという内容
    * 先に `B.fmp12` ファイルでスクリプトを作成しておく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/0057784b-f51e-cb5f-c9d2-c9548475e4c9.png)


## B.fmp12
### フィールドの用意
* `A.fmp12` ファイルの準備と同時に進める

### スクリプトの作成
* 以下の三つを用意
    * `open`
    * `set_global_var`
    * `return_global_var`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/40799fa2-8192-696f-b54e-688ecaf448d0.png)

* `open` については以下のように
    * 先に `set_global_var` を作っておく
    * ここでは単に `set_global_var` を実行するだけなので、直接グローバル変数セットしてもよいけれど……クセとしてこういうつくりに

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/5ba7bc4b-217f-7bb2-83a9-5c475d8801ce.png)

* `set_global_var` については以下のように
    * グローバル変数にフィールドの値をセットする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/4a7f2680-51e2-97cf-c9e4-2cdb99115aef.png)

* `return_global_var` については以下のように
    * 'set_gloal_var' で格納されたグローバル変数を結果として返す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/36cffa7e-39d5-5c68-e2cf-58b8731b0b1a.png)


### スクリプトトリガの設定
* ファイルオプションのスクリプトトリガ `OnFirstWindowOpen` に `open` スクリプトを指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/76ab5377-06c3-2bf7-79ae-fa6131961042.png)


# 検証
## A だけ開く → スクリプト実行
* `A.fmp12` ファイルだけを開く
* スクリプト `confirmation` を実行
    * 値が何も返ってきていない ＝ `B.fmp12` ファイルでグローバル変数が格納されていないことを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/832c47fd-2580-5d2e-a55f-d233f659f658.png)

* このあとで `B.fmp12` ファイルを開く
* `B.fmp12` ファイルのデータビューアを確認
    * 空であることを確認
    * 先に `A.fmp12` ファイルでスクリプトを実行してからファイルを開くと `OnFirstWindowOpen` が実行されない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/3dfb90a2-3d79-50b3-941a-217ae4a710ec.png)


## A を開く → B を開く → スクリプト実行
* `A.fmp12` ファイルを開く
* `B.fmp12` ファイルも開く
* `A.fmp12` 内のスクリプト `confirmation` を実行
    * 値が正しく返ってきていることを確認
    * スクリプト実行前に `B.fmp12` ファイルを明示的に開いておくと、その時点で `OnFirstWindowOpen` が実行される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/b4c9dd95-1f22-d4c5-3711-da7caa034884.png)

* 当然、データビューアにも格納されている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/50e40449-1ec5-6e33-f9e2-ff0292b0f848.png)


# おわりに
## まとめ
### `OnFirstWindowOpen` スクリプトトリガが実行されなくなる条件一例
* `B.fmp12` ファイルを明示的に開かずに、 `A.fmp12` ファイルで `B.fmp12` 内のスクリプトを実行してしまうと、`OnFirstWindowOpen` が実行されなくなってしまう
    * この後に `B.fmp12` を開いても `OnFirstWindowOpen` は実行されない

## 感想
* `OnFirstWindowOpen` という名前なので、ウィンドウが開いていなければ実行されないトリガなのだ、という言い分であれば、それはまあ分かるのですが、その後実際にウィンドウを開いても実行されないのは First じゃないからだよという判定になってしまっているということなのか。いやでもファイルは裏側で開いているとしても、ウィンドウを開くのは初めてだよ……？？　と思ってしまった……
* であれば `OnFirstFileOpen` というスクリプトトリガを強く欲してしまうのですが。いかがでしょうか？
* FileMaker Pro 17 以前での実行検証はしていませんが、同じ挙動でしたかね……？
    * @OnTheRocks-plz さんによると FileMaker Pro 16 でも同じ挙動が確認されたとのことです！

## 解決編
* じゃあ一体どうすればよいのです？🤔　という人のための、解決編記事は以下の通りです！
    * [Qiita - FileMakerProの"OnFirstFileOpen"スクリプトトリガを実行させるたった一つの冴えたやり方](https://qiita.com/Hi_Noguchi/items/951c775e7169c276218b)