FileMaker 2024 で「トランザクション復帰」スクリプトステップが、「スクリプト実行」ステップから呼び出されたスクリプト(以降サブスクリプトと呼びます)でも利用できるようになりました。復帰する条件をサブスクリプトでも設定できるようになったため、トランザクション制御がより柔軟になりました。
「トランザクション復帰」のおさらい
FileMaker には、「トランザクションを開く」から「トランザクション確定」までの処理の中で、レコード編集に失敗するようなエラーが発生した場合に自動的にトランザクションを復帰させる機能があります。この場合、スクリプトは「トランザクション確定」のステップに遷移します。
一方、「トランザクション復帰」スクリプトステップを使用すると、開発者が任意の条件を設定してトランザクションを復帰させることができます。これにより、レコード編集に失敗するようなエラー以外の状況でもトランザクションを復帰させることが可能になります。
「トランザクション復帰」スクリプトステップには以下のオプションがあります。
[条件]
「トランザクションを開く」以降の処理を復帰させる条件を計算式で設定します。計算結果が真の場合に復帰します。
[エラーコード]
5000〜5499で任意のエラーコードを設定すると、 Get (最終エラー) 、 Get (最終エラー詳細) 、および Get (最終エラー位置) のカスタムエラーコードを返します。
それ以外の番号、または空欄の場合、「トランザクション復帰」はおこなわれますが、 Get (最終エラー) で取得した値は0となり、 Get (最終エラー詳細) 、および Get (最終エラー位置) は空を返します。
[エラーメッセージ]
エラーコードが 5000〜5499の場合に Get (最終エラー詳細) および Get (最終エラー位置) のカスタムエラーメッセージを返します。
サブスクリプトでの「トランザクション復帰」
FileMaker 2024 ではサブスクリプトでの「トランザクション復帰」について、大きく変わった点が2つあります。
1.「トランザクション復帰」のステップが単独で設定できる
「トランザクション復帰」は「トランザクションを開く」から「トランザクション確定」までの処理の中でしか設定することができませんでしたが、このステップのみでの記述が可能になりました。一連のスクリプト処理の中で、「トランザクション復帰」よりも前に「トランザクションを開く」、後ろに「トランザクション確定」が無い場合、「トランザクション復帰」は無視されます。
2.サブスクリプト内の「トランザクション復帰」が有効になった
以前は、サブスクリプト内の「トランザクション復帰」は無視されていたため、トランザクションの復帰条件を開発者が任意で設定するためには相応の処理が必要でした。おそらくこの点が理解しづらかったため、、多くの開発者がこの機能を活用していなかったのではないかと考えられます。
上記変更点の違いが分かるよう、バージョンによるスクリプトの構築方法の参考例を以下に示します。
<FileMaker 2023 までの構築方法>
#スタートスクリプト
#
1 エラー処理 [ オン ]
2 トランザクションを開く []
3 スクリプト実行 [ 指定: 一覧から ; 「サブスクリプト」 ; 引数: ]
4 変数を設定 [ $スクリプトの結果 ; 値: Get ( スクリプトの結果 ) ]
5 トランザクション復帰 [ 条件: $スクリプトの結果 <> 0 ; エラーコード: 5000 ; エラーメッセージ: "検索のエラー"]
~この間にも処理があると想定~
9 トランザクション確定
10 If [ Get ( 最終エラー ) <> 0 ]
11 カスタムダイアログを表示 [ Get ( 最終エラー詳細 ) ]
12 End If
# サブスクリプト
#
1 レイアウト切り替え [ 「従業員」 (従業員) ; アニメーション: なし ]
2 検索モードに切り替え [ 一時停止: オフ ]
3 フィールド設定 [ 従業員::所属名称 ; "営業部" ]
4 エラー処理 [ オン ]
5 検索実行 []
6 変数を設定 [ $エラー ; 値: Get ( 最終エラー ) ]
7 エラー処理 [ オフ ]
8 If [ $エラー <> 0 ]
9 現在のスクリプト終了 [ テキスト結果: $エラー ]
10 End If
11 フィールド内容の全置換 [ ダイアログあり: オフ ; 従業員::所属名称 ; "マーケット推進部" ]
12 現在のスクリプト終了 [ テキスト結果: 0 ]
スタートスクリプト
1.「トランザクションを開く」を実行
2. 3行目の「スクリプト実行」によりサブスクリプトに入る
サブスクリプト
3. 8行目「If」ステップで、Get ( 最終エラー ) のエラー番号によって処理の分岐
4. 9行目、問題があれば「現在のスクリプト終了」スクリプトステップに結果を入れて、サブスクリプトを終了
スタートスクリプト
5. 4行目へ移動し、Get(スクリプトの結果) でサブスクリプトからの結果を取得
6. 5行目「トランザクションの復帰」の条件式でサブスクリプトの結果を受けて判定
7. 問題があればトランザクションが復帰され、9行目「トランザクション確定」ステップへ飛ぶ
< FileMaker 2024 からの構築方法>
#スタートスクリプト
#
1 エラー処理 [ オン ]
2 トランザクションを開く []
3 スクリプト実行 [ 指定: 一覧から ; 「サブスクリプト」 ; 引数: ]
~この間にも処理があると想定~
6 トランザクション確定
7 If [ Get ( 最終エラー ) <> 0 ]
8 カスタムダイアログを表示 [ Get ( 最終エラー詳細 ) ]
9 End If
# サブスクリプト
#
1 レイアウト切り替え [ 「従業員」 (従業員) ; アニメーション: なし ]
2 検索モードに切り替え [ 一時停止: オフ ]
3 フィールド設定 [ 従業員::所属名称 ; "営業部" ]
4 エラー処理 [ オン ]
5 検索実行 []
6 変数を設定 [ $エラー ; 値: Get ( 最終エラー ) ]
7 エラー処理 [ オフ ]
8 トランザクション復帰 [ 条件: $エラー <> 0 ; エラーコード: 5000 ; エラーメッセージ: "検索のエラー code:" & Get ( 最終エラー ) &¶& "テスト" ]
9 フィールド内容の全置換 [ ダイアログあり: オフ ; 従業員::所属名称 ; "マーケット推進部" ]
10 現在のスクリプト終了 [ テキスト結果: "" ]
スタートスクリプト
1.「トランザクションを開く」を実行
2. 2行目「スクリプト実行」によりサブスクリプトに入る
サブスクリプト
3. 8行目「トランザクションの復帰」の条件式で、Get ( 最終エラー ) のエラーコードを判定
スタートスクリプト
4. 3.の条件で問題があればトランザクションが復帰され、6行目「トランザクション確定」ステップへ飛ぶ
今回の機能強化により、「トランザクションの復帰」がサブスクリプトでサポートされるようになったため、サブスクリプトのエラー対応が簡潔に記述できるようになりました。
FileMaker 2024 からの構築方法を見て分かるように、サブスクリプトで「トランザクションを開く」「トランザクション確定」のステップが無くても「トランザクション復帰」は有効です。これは、スタートスクリプトからの一連のスクリプト処理の中に「トランザクションを開く」「トランザクション確定」が含まれており、この2つのステップの間に「トランザクション復帰」があるからです。そのため、このサブスクリプトを単独で実行すると、「トランザクション復帰」は無視されて処理が進みます。
サブスクリプト内に「トランザクションを開く」「トランザクション確定」のステップを記述し、そのサブスクリプトをスタートスクリプトから呼び出して実行した場合、どのような動作になるでしょうか?
その場合、結果はスタートスクリプトにのみ「トランザクションを開く」「トランザクション確定」があるときと同じになります。つまり、一連のスクリプト処理の中で、最も外側(最上階層)のトランザクションステップのみが有効になり、サブスクリプト内のトランザクションステップは無視されます。
トランザクションが復帰する条件が発生すると、処理は最上階層の「トランザクション確定」のステップに飛びます。
まとめ
FileMaker 2024で「トランザクション復帰」がサブスクリプトでサポートされたことにより、トランザクション制御の柔軟性が大きく向上しました。この機能強化によって、複雑なトランザクション処理の実装が容易になり、開発の生産性向上が見込まれます。
この新機能を活用することで、FileMaker プラットフォームでのアプリケーション開発がさらに効率化されることを期待しています。開発者の皆さんには、この機能の特性を理解し、適材適所で活用していただければと思います。
今後、スクリプト記述の参考例やサブスクリプトでの挙動検証をおこない、その結果をブログで掲載する予定です。トランザクション処理の理解を深め、より効率的で安定したシステム開発に役立てていただければ幸いです。ぜひ、チェックしてみてください。
本記事の注目度
本記事の注目度を測りたく、下記のクリック数を集計しております。
本ブログをご覧いただけた方は下記リンクより Claris 製品ページをご覧いただけると幸いです。