この記事では FileMaker Pro 2024(バージョン21)で強化された [トランザクションを復帰] に関連する3つのスクリプトステップである、

  • トランザクションを開く
  • トランザクションを復帰
  • トランザクションを確定

 について解説します。

 [トランザクションを開く], [トランザクションを復帰], [トランザクションを確定] これら3つのスクリプトを利用することで、いわゆる「トランザクション処理」を作成することが可能です。


 「トランザクション処理」とは?

  トランザクション処理とは、結果が「成功」か「失敗」しかないのみの処理のことです。よく銀行の振り込み処理に例えられて解説されます。

 たとえば、「A口座 ( 残高:¥100,000 ) から B口座 ( 残高:¥200,000 ) に ¥30,000 送金する」という操作を行うとき、

  1. A口座から ¥30,000 をマイナスする。¥100,000 – ¥30,000 = ¥70,000
  2. B口座に ¥30,000 をプラスする。¥200,000 + ¥30,000 = ¥230,000

という2つの工程が必要です。

 成功の場合にはデータの書き込みを確定しますが、途中いずれかの処理に失敗すると金額のやり取りに齟齬が生じるので、データを取引前の状態に戻す必要があります。

 この処理は他にも、在庫管理や予約管理などの様々な場面で利用されています。


[トランザクションを開く] の使い方

 今回ご紹介する3つのスクリプトステップは、基本的にセットで利用することが前提のスクリプトステップです。ただし、入力値の制限のエラーなどをきっかけにして復帰も可能なため、[トランザクション復帰] を使わないときもあります。

 利用方法は以下のとおりです。

  1. [トランザクションを開く], と [トランザクション確定] を設定する。
  2. 1 の間に、実際に行う処理のスクリプトステップを設定する。
  3. 【任意】処理のどこかに [トランザクション復帰] を設定し、データの変更を復帰する場合の条件を記述する。

 実際にスクリプトを作成すると、次の画像のようになります。

 上記のスクリプト実行したとき、正しくフィールドへの変更(口座情報への書き込み)ができれば、そのまま変更を確定します。もしエラーがあった場合は、 [トランザクション復帰] に設定した条件が真になるので、[トランザクションを開く] から [トランザクション確定] の間に実行した処理をすべて復帰して、変更をなかったことにします。

 さらに [トランザクション復帰] には、5000 〜 5499 のいずれかのエラーコードと、任意のエラーメッセージを設定することができます。設定したエラー情報は、[トランザクション確定] の直後に [Get ( 最終エラー )], [Get ( 最終エラー詳細 )], [Get ( 最終エラー位置 )] を使用することで、詳細を取得することができます。5000 〜 5499 以外の数値が指定された場合は機能しません。

 [Get ( 最終エラー )], [Get ( 最終エラー詳細 )], [Get ( 最終エラー位置 )] で取得できる内容は以下のとおりです。[Get ( 最終エラー詳細 )] は [トランザクション復帰] のエラー情報とカスタムエラーメッセージを、 [Get ( 最終エラー位置 )] は [トランザクション確定] のエラー情報を取得します。

 また、下記の条件を満たしている場合、[トランザクション確定] 時にシステムのエラーダイアログが表示されます。[トランザクション復帰] にエラーメッセージを指定すると、エラーメッセージも表示されます。

  • [トランザクション復帰] の復帰条件に合致した。
  • [トランザクション復帰] のエラーコードの指定の結果が 5000 ~ 5499 のいずれかの値である。
  • [エラー処理: オフ] もしくはエラー処理が設定されていない。

 [エラー処理: オン] の場合は、このダイアログは表示されません。


細かな注意点

[トランザクションを開く] は複数実行できない

 [トランザクションを開く] 中にさらに別の [トランザクションを開く] は設定できません。もし同一スクリプト内の [トランザクションを開く] 〜 [トランザクション確定] の間に設定しようとしても、「スクリプトステップが無効です。」というエラーが出て設定できません。

 [トランザクションを開く] を設定したサブスクリプトを [トランザクションを開く] 中のメインスクリプトから実行した場合は、自動的に [トランザクションを開く], [トランザクション確定] がスキップされ、その間に設定したスクリプトステップだけが実行されます。

[トランザクションを開く] は現在のウインドウにのみ摘要される

 [トランザクションを開く] で一連の処理としてみなされる変更は、[トランザクションを開く] を実行したウインドウへのみ行われます。[トランザクションを開く] の最中に別ウインドウを開いて行った変更は、[トランザクション復帰] でも復帰されません。

 逆に言うと、[トランザクションを開く] を実行したウインドウでさえあれば、レイアウト切り替えをして行った変更や、リレーションを介してポータルに対して行った変更も復帰の対象になります。

データの変更に使用できるスクリプトステップについて

 [トランザクションを開く] 中に使用できるスクリプトステップについては、Claris FileMaker Pro ヘルプ に詳細が記載されています。新規レコードの作成・レコードの削除・フィールド設定などの、データに変更を加えるスクリプトステップはほぼ使用できますが、実際に開発するときには、本当に使用することができるかを必ずヘルプで確認してください。

 ちなみに、[レコードのインポート] ステップで新規テーブルとしてインポートを実行した場合には「新しいテーブル」と「新しいレイアウト」が作成されますが、[トランザクション復帰] をすると、このとき作成されたテーブルとレイアウトも削除されます。

[トランザクション復帰] のバージョンによる動作の違い

 [トランザクション復帰] は、バージョン21ではサブスクリプト内でも動作し、条件に合致した直後にメインスクリプトの [トランザクション確定] ステップに移動するようになりました。

 21より前のバージョンの [トランザクション復帰] はサブスクリプト内では動作しません。サブスクリプト内で発生したエラーをもとに変更を復帰させたい場合は、Get ( スクリプトの結果 ) などでエラー情報をメインスクリプトで取得し、メインスクリプトに設定した [トランザクション復帰] でそのエラー情報を処理する必要があります。

トランザクションが復帰される条件について

 [トランザクション復帰] ステップの条件に一致する以外にも、以下の場合にはトランザクションが復帰されます。

  • データベースの管理でフィールドに入力値の制限を設定していて、[トランザクション確定] の際にその条件を満たしていないフィールドがある。
  • スクリプトをキャンセルする。
  • [全スクリプト終了] を実行する。
  • アクセス権が足りずにテーブルやレコードにアクセスできない。
  • スクリプトデバッガでスクリプトをキャンセルする。

復帰できない要素

 以下の変更は [トランザクション復帰] でも復帰されません。

  • [テーブルデータを削除] スクリプトステップで削除したデータ
  • 入力値の自動化オプションで設定して増えたシリアル番号の [次の値]
  • [FileMaker Data API を実行] スクリプトステップで変更した内容

Get (トランザクションオープン状態)

 トランザクションが開いている場合は「1」を、それ以外の場合は「0」を返します。


さいごに

 いままで FileMaker でトランザクション処理を行う場合は、たくさんの分岐を作成する、 スクリプトトリガを利用してレコードの確定を抑制する、複数テーブルにわたる処理を行う場合はポータルを利用するなど、複雑な処理を作成する必要がありました。これからは複雑な処理を省いてトランザクション処理を作成することができるので、ぜひお試しください。