FileMakerで処理を自動化していると、「同じスクリプトが二重に動いてしまった」「想定外のタイミングで実行されてデータがおかしくなった」という経験はないでしょうか。ボタンの連打や、サーバースケジュールとのバッティング、別ユーザーからの同時実行など、原因はさまざまですが、いずれも「多重実行を防ぐ仕組み」があればかなり減らせます。
この記事では、FileMakerでよく使われる「実行中フラグ」を使った多重実行防止の考え方と、基本的な設計・実装方法を、なるべく専門用語を避けて分かりやすく解説します。
実行中フラグとは?なぜ必要なのか
「実行中フラグ」とは、「このスクリプトは今動いている最中です」という状態を記録しておくための目印です。
具体的には、テーブルのフィールドに「1」や「True」などの値を入れておき、スクリプトの冒頭でそれをチェックします。
- フラグが空(未設定)なら:まだ誰も実行していないので、これから実行してよい
- フラグが立っているなら:すでに誰かが実行中なので、新たな実行はやめる
このように、実行開始前に必ず「今、動いているスクリプトがないか」を確認することで、多重実行を防ぎます。
実行中フラグをどこに持たせるか
実行中フラグをどこに保存するかによって、設計や挙動が変わります。よく使われるのは次の3パターンです。
- グローバル変数(例:$$ScriptRunning)
- グローバルフィールド(例:設定テーブルにグローバルフィールドを用意)
- 専用テーブルのレコード(例:制御テーブルに「実行中」フィールドを用意)
1ユーザーだけを対象にするならグローバル変数でもよいですが、複数ユーザーやサーバースクリプトも含めて全体で1本だけ動かしたい場合は、共有できる場所(グローバルフィールド以外)にフラグを置く必要があります。
つまり、「誰と競合を避けたいのか」を決めてから、フラグを置く場所を選ぶのがポイントです。
基本パターン:設定テーブルに実行中フラグを持たせる
ここでは比較的わかりやすい「設定テーブルにフラグを置く」方法を紹介します。
- 「設定」などの名前のテーブルを1つ用意する
- そのテーブルに、テキスト型フィールド(例:
z_scriptRunning)を作る - そのレコードは1件だけにしておく(システム全体の設定用レコード)
このフィールドが「空」なら未実行、「1」なら実行中、という形にします。
スクリプトの流れ:実行前チェック~終了処理まで
実行中フラグを使ったスクリプトの基本的な流れは、次のようになります。
- 設定テーブルのレコードを開く(レイアウト切り替えなど)
- 実行中フラグが立っているか確認する
- 立っていたら、その場で終了(メッセージを表示)
- 立っていなければ、フラグを「実行中」に変更する
- 本来の処理を実行する
- 処理が終わったら、フラグをクリア(空に戻す)
ポイントは、「開始時に必ずチェックし、必ず最後にフラグを戻す」ことです。これを忘れると、ずっと「実行中」のままになり、以降ずっとスクリプトが動かなくなってしまいます。
エラーや強制停止に備える工夫
実行中フラグの弱点は、「スクリプトが途中でエラー停止したときに、フラグが戻らないことがある」という点です。これを避けるために、いくつかの対策を組み合わせると安心です。
- サブスクリプトに実行中フラグの処理をまとめる
開始時のチェックと、終了時のクリアをそれぞれサブスクリプト化しておき、どのスクリプトでも必ず呼び出すようにするとミスが減ります。 - 「Set Error Capture [ On ]」ステップでエラー表示を抑制する
重要な処理では、必要に応じて「Set Error Capture [ On ]」で標準のエラーダイアログを抑制し、「Get(最終エラー)」関数でエラーを検出して、エラー発生時もフラグをクリアしてから終了するようにします。 - タイムスタンプも記録する
フラグと一緒に「開始時刻」も保存しておくと、「1時間以上前から実行中のままになっている」などの異常状態を検知しやすくなります。
ユーザーへのメッセージ表示の工夫
多重実行を防げても、「なぜ動かないのか」が分からないとユーザーは戸惑います。
実行中フラグが立っていたときは、次のようなメッセージを表示しておくと親切です。
- 「現在、別のユーザーが同じ処理を実行中です。しばらく待ってから再度お試しください。」
- 「前回の処理が完了していない可能性があります。管理者に連絡してください。」
また、処理に時間がかかる場合は、「処理を開始しました」「完了しました」といったメッセージを表示することで、「今まさに動いている」ことをユーザーに伝えられます。
どのスクリプトに実行中フラグを付けるべきか
すべてのスクリプトに実行中フラグを付ける必要はありません。特に次のようなスクリプトでは、多重実行防止のメリットが大きくなります。
- 集計・請求書発行など、大量データを更新する処理
- 毎日・毎月の定期処理(サーバースケジュールも含む)
- 在庫・売上など、同じレコードをまとめて調整する処理
逆に、1件だけの編集や単純な画面切り替えなど、影響範囲が小さいスクリプトでは、省略しても問題ないケースが多いです。
「多重実行されると困るスクリプト」を洗い出し、優先的に実行中フラグを設計していくと、現場への影響を抑えやすくなります。
まとめ:小さな仕組みで大きなトラブルを防ぐ
FileMakerのスクリプトはボタン1つで簡単に実行できる一方で、多重実行によるデータ不整合や負荷増大といったリスクも抱えています。
「実行中フラグ」をうまく設計しておけば、
- 同じスクリプトが同時に動くことを防げる
- ユーザーに分かりやすいメッセージが出せる
- トラブル時の原因調査もやりやすくなる
といった効果が期待できます。まずは重要なスクリプトから、「実行前チェック」と「終了時クリア」の2ステップを取り入れ、小さく試しながら自分のシステムに合った運用スタイルを整えていきましょう。