FileMakerで業務システムを作っていると、「あれ、このデータいつの間にか変わっている」「集計値が合わない」といった不整合に悩まされることがあります。原因のひとつが、レコードの「コミット(確定)」タイミングのコントロール不足です。
本稿では、FileMakerのコミットの仕組みをやさしく整理しつつ、不整合を防ぐための基本的な設定・操作のポイントを解説します。
コミットってそもそも何?
FileMakerでは、レコードを編集している間は「編集中」、編集を確定した瞬間に「コミット済み」という状態になります。
この「コミット」のタイミングで、ほかのユーザーからも変更内容が見えるようになり、集計値の再計算やスクリプトトリガも走ります。
コミットがコントロールできていないと、例えば次のような問題が起きやすくなります。
- 入力途中の値で集計が更新されてしまう
- 別ユーザーが古い値を元に処理をしてしまう
- 関連レコード側が中途半端な状態で保存される
逆にいえば、「いつコミットさせるか」を設計しておくことで、データの不整合をかなり防ぐことができます。
自動コミットを理解しておこう
FileMakerは、ユーザー操作に応じて自動でコミットを行います。代表的なタイミングは次のとおりです。
- 別のレコードに移動したとき
- 別のレイアウトに移動したとき
- ウィンドウを閉じたとき
- ユーザーが「レコードをコミット」メニューを実行したとき
つまり、ユーザーが意図しないところでコミットが起きている場合があります。「途中で別画面を見に行ったら、その時点の入力内容で保存されていた」というのは、まさに自動コミットが原因です。
不整合を防ぐ基本方針
コミットにまつわる不整合を防ぐには、次のような方針で画面やスクリプトを設計するとよいでしょう。
- 重要な処理は「ボタンを押したときだけコミットさせる」
- レイアウト移動で意図せずコミットしないようにする
- 関連テーブルの編集はひとまとまりの処理としてコミットさせる
これらを実現するための、具体的な設定・操作方法を見ていきます。
「レコードのコミット」スクリプトを用意する
まずは、コミット操作をスクリプトとして明示的に用意しておくと便利です。
以下は、もっとも基本的なコミット用スクリプトの例です。
- スクリプトワークスペースを開き、新規スクリプトを作成
- 名前を「レコード確定(コミット)」などにする
- ステップ「レコードをコミット」を追加
- オプション「ダイアログあり」は、通常は「オフ」にする
このスクリプトを「登録する」「保存する」ボタンに割り当てておけば、ユーザーはボタンを押したタイミングでのみコミットされるようになります。
入力中のフィールドを途中でクリックしても、別のボタンを押しても、そのスクリプトを通らない限りコミットされないため、状態をコントロールしやすくなります。
「レイアウト移動でのコミット」に注意する
レイアウト切り替えが多いシステムでは、気づかないうちにコミットが行われていることがよくあります。
その対策として、レイアウト移動の前後に、スクリプト側で明示的なコミットとチェックを入れておくと安心です。
例:メイン画面から詳細画面へ移動するスクリプト
- 「もし」ステップで、対象レコードが編集中かどうかを判定(Get( レコード変更フラグ ) を利用)
- 編集中なら、「保存しますか?」とカスタムダイアログで確認
- 「はい」の場合:「レコードをコミット」してからレイアウトを切り替え
- 「いいえ」の場合:変更をキャンセル(「レコードを再読み込み」ステップなど)してからレイアウトを切り替え
このように、レイアウトを移動するときに「保存する/しない」をユーザーに意識させることで、不意のコミットを防ぐことができます。
スクリプトトリガで入力完了のタイミングをそろえる
FileMakerには、ユーザー操作に反応してスクリプトを自動的に起動する「スクリプトトリガ」があります。
コミットのタイミングと組み合わせることで、「入力がひととおり終わったときに確認処理やチェック処理をまとめて実行する」といった制御がしやすくなります。
よく使われるのが、レイアウトレベルの「OnRecordCommit(レコードがコミットされたとき)」トリガです。
- 対象レイアウトをレイアウトモードで開く
- レイアウト設定 > スクリプトトリガを開く
- 「OnRecordCommit」にチェックを入れ、実行したいスクリプトを指定
ここに、必須項目のチェックや、自動採番・集計の調整などをまとめて書いておくと、「コミットされたデータは必ず整った状態になっている」という前提で設計しやすくなります。
関連レコードの更新は「ひとかたまり」で
受注ヘッダと受注明細のように、親子関係のテーブルを扱う場合、片方だけコミットされてもう片方が編集中のまま……という状態は避けたいところです。
対策としては、次のような作りにすると、整合性を保ちやすくなります。
- 受注明細の編集はポータル上で行う
- 「受注を登録する」ボタンを用意し、そのスクリプト内で
・親レコードの必須項目チェック
・明細行のチェック(数量・単価など)
・必要な計算の実行
・最後にまとめて「レコードをコミット」
このとき、必要であれば親子テーブルともにロックされるような処理順やスクリプト手順を検討します。「途中の状態ではコミットしない」を徹底することがポイントです。
ユーザー操作をできるだけ単純にする
コミットのタイミングを厳密にコントロールしても、ユーザーにとって操作が複雑になりすぎると、結局は誤操作が増えてしまいます。
「保存はこのボタンだけ」「保存しないで閉じるときはこのボタンだけ」というように、ルールをシンプルにし、ボタン配置や名称も分かりやすくすることが重要です。
また、「自動で保存されるところ」と「保存ボタンが必要なところ」をレイアウトごとに整理し、設計側もユーザー側も混乱しないようにしておくと、不整合のリスクがさらに減らせます。
まとめ:コミットを制する者が整合性を制する
FileMakerのコミットは、ふだんあまり意識されませんが、データの整合性を守るうえで、とても重要な仕組みです。
ポイントは次のとおりです。
- コミットの自動タイミング(レイアウト移動など)を理解しておく
- 重要な処理はボタン+スクリプトで明示的にコミットさせる
- スクリプトトリガで「コミットされたデータは必ず整った状態」にする
- 関連レコードの更新はひとかたまりでコミットする
コミットのタイミングを意識した画面・スクリプト設計にすることで、「いつの間にかおかしくなっていた」という不整合トラブルを、大きく減らすことができます。
まずは、既存のレイアウトやスクリプトで、どのタイミングでコミットされているかを洗い出してみるところから始めてみてください。