オフライン(ローカル)ファイルで確実にレコードを保存する

久しぶりの技術的な投稿になります。
先日の FileMaker Pro 東京ユーザーズミーティング(通称:FM-Tokyo) でLTした内容を記します。

レコードを保存したのに、保存されていない?

PCやMacでFileMakerを使っているときは、よほどのことがない限りアプリケーションの強制終了は行わないと思います。
しかし、iOSでは日常的にアプリケーションの強制終了をされていると思います。
ホームボタンをダブルクリックもしくは下からスワイプ操作をし、
アプリケーションのプレビュー画面を上方向にスワイプする操作です。

iPhone、iPad、iPod touch で App を強制終了する方法

ある条件下でアプリケーションの強制終了をすると、
レコード確定やレコード削除操作がエラーなく完了したとしても、
あたかもその操作が無かったような状態まで戻ってしまうことがあります。

発生する条件と原因

発生する条件は次の条件がすべて揃うときです。

  • オフライン(ローカル)ファイルを実行している
  • レコードを確定もしくは削除後、数秒以内に(バックグラウンドに移行せずに)アプリケーションを強制終了する

対策は後で説明しますが、先に原因から説明します。
FIleMaker では高速化を図るために、メモリー上の操作を優先し、
一定間隔をおいて変更内容をまとめてディスクへ書き込んでいます。
その間隔の隙間のうちに強制終了されてしまうと、
今回のようなレコードがディスクに保存されていない現象になります。

そのため細かい話ですが、
iOSの場合はホーム画面に一度もどしたり、FileMaker Go以外のアプリケーションに切り替えを行うと、
FileMaker Goがバックグラウンドに移行します。
フォアグラウンドからバックグラウンドへ移行するその瞬間自動的にメモリーのキャッシュ内容をディスクに書き込む仕様なので、
その後強制終了したとしても今回のようなレコードが保存されていないなどの不具合は発生しません。

また、オフライン(ローカル)ファイルではなく、
FileMaker ServerやCloudのファイルにネットワーク経由で接続して実行している場合は問題はありません。
保存されるべきディスクはFileMaker ServerやCloud側であり、
クライアントアプリケーションが強制終了されても問題は発生しません。

対策

利用ユーザーに「いきなり強制終了はやめてね」というのも運用による対策ですが、
便利なスクリプトステップが10年以上前から用意されていました。

キャッシュをディスクに書き込む

クラリス FileMaker Pro 18 Advanced ヘルプページ

このスクリプトステップを次のスクリプトステップの直後に必ず入れましょう。
それですべて解決です。
負荷はそれほど掛からないようなので、気軽に入れても大丈夫かと思います。

  • レコード確定
  • レコード削除
  • 対象レコード削除
  • テーブルデータを削除
  • レコードのインポート
  • フィールド内容の全置換
  • フィールド内容の再ルックアップ

また明示的にレコード確定を使用していない場合、
レコードを編集したあと次のタイミングでFileMakerは自動的にレコードの確定を行っています。
ですのでレコードを編集したあとに次のスクリプトステップがあれば、その直後に入れると良いでしょう。

  • レイアウト切り替え
  • レコードへ移動
  • 新規レコード/複製
  • レコードのインポート/エクスポート
  • レコードの保存/送信
  • 拡大表示/縮小表示
  • 再ログイン
  • ファイルを閉じる/ウインドウを閉じる
  • モードの切り替え/表示形式の切り替え