はじめに
前書き
- この記事は FileMaker Advent Calendar 2020 24 日目の記事です。
- 現時点 ( FileMaker Pro 19.2 ) では OnFirstFileOpen などというスクリプトトリガは存在しません。そのため、それと同じ挙動を果たすものを実装しようという記事内容です。
対象読者
- Claris FileMaker Pro ユーザー
- スクリプトトリガで OnFirstWindowOpen を使っている/今後使おうと考えている人
- 前回記事 ( Qiita - FileMakerProのOnFirstWindowOpenスクリプトトリガ実行時の不思議な挙動 ) を読んできて、 OnFirstWindowOpen のバグ的とも言える挙動に頭を抱えてしまった人
検証環境
- Windows 10 Pro ローカル環境
- FileMaker Pro 19.2.1.14
準備
ファイルの準備
- 以下二つのファイルを用意します
- A.fmp12
- B.fmp12
A.fmp12
- 前回記事 ( Qiita - FileMakerProのOnFirstWindowOpenスクリプトトリガ実行時の不思議な挙動 ) の準備と全く同じなので、そちらを参照。
B.fmp12
フィールドの用意
-
A.fmp12
ファイルの準備と同時に進める。リレーションさえ結べればよいので、何でも構わないから値を入れておいてください。
スクリプトの作成
- 以下の四つを用意
open
set_global_var.for_return
set_global_var.done_init_open
return_global_var.for_return
-
open
については以下のように- 一度実行されたら、二度目は実行されないようにする
-
set_global_var.for_return
については以下のように- 一度しか実行されなければ
1
がセットされるだけ - もし二度以上実行されたら、実行された回数分だけ数字が増えてしまうように
- 一度しか実行されなければ
-
set_global_var.done_init_open
については以下のように- 一度実行されたよ、というフラグ
-
return_global_var.for_return
については以下のように-
set_global_var.for_return
で格納されたグローバル変数を結果として返す
-
ファイルオプション
-
表示するレイアウト
の指定をおこなう
スクリプトトリガの設定
- 上記で指定をしたレイアウトにおいてスクリプトトリガを設定する
-
OnLayoutEnter
でopen
スクリプトを指定
検証
A だけ開く → スクリプト実行
-
A.fmp12
ファイルだけを開く - スクリプト
confirmation
を実行- 明示的に
B.fmp12
ファイルを開いていないにもかかわらず、正しく値が1
として返ってくる!
- 明示的に
B を開いて別レイアウトと行き来してみる
- 別レイアウトを用意し、行き来してみても……
- 値は増えていません!
- なお
open
スクリプトの二度目以後実行の制御をコメントアウトしてみると……
- 当然、値が増えます。レイアウトを開き直せば開き直すだけ、値は増え続けます。ということで、ちゃんと制御は入れておきましょう。
おわりに
まとめ
- 「ファイルを開いたとき最初に一度だけ必ずスクリプトが実行されるように」という "OnFirstFileOpen" を自分で実装するには、以下の手順を踏みましょう
- 初期表示用のレイアウトを用意
-
OnLayoutEnter
スクリプトトリガでopen
スクリプトを実行 -
open
スクリプトが再実行されないようにグローバル変数でフラグ処理をすること
- つまり、
OnFirstWindowOpen
とOnWindowOpen
には頼るんじゃない! 頼れるのはOnLayoutEnter
だ! ということになるかと思います。スクリプトトリガ実行用のレイアウトを用意するのが、ベストプラクティスということでしょう。
感想
- たった一つじゃない可能性は大いにありますが、何はともあれこれでやりたいことは実現できるし、予期せぬ挙動で沼に落ちることもなくなります。
ちなみに
- OnFirstWindowOpen の代わりに OnWindowOpen を使えば良いのでは? と思って試してみたところ、やっぱり OnFirstWindowOpen と同じくで、裏側でウィンドウが開いた扱いになっているせいか、実行されませんでした。やっぱり完全にバグなのでは🤔