待望の トランザクション スクリプト登場 Part3

こんにちは。名古屋の加藤です。

前回に引き続きトランザクションスクリプトについてです。
今回はトランザクションスクリプトの注意点についてもう少し詳しく見ていきたいと思います。

こんな場合は要注意

Claris FileMaker 19.6 で実装されたトランザクションスクリプトを使わないで、トランザクション処理をする方法(参考)の場合、取得できない値がありました。
簡単に説明すると、レコードを新規作成(ここでは「親レコード」と呼びます)し、レコード確定する前に、関連レコード(ここでは「子レコード」と呼びます)を作成したときに、子レコードから親レコードの値が取得できない場合がありました。

これを Claris FileMaker 19.6 で実装されたトランザクションスクリプトを使って検証してみました。

検証に使用したスクリプトは以下のようになっています。

11行目の「新規レコード/検索条件」によって親レコードが作成されます。
15行目の「レコード/検索条件確定」は前回書きましたが、無視されますので実際にはレコードは確定されません。
19行目でリレーション作成によって関連レコードである子レコード(報告レコード)が作成されます。
このとき、子レコードの「掛け率」フィールドには以下のように入力値の自動化の計算式が設定されていますので日報レコードの掛け率が自動的に入力されるはずです。

しかし、親レコードが新規作成の状態ではやはり子レコードから親レコードの値が取得できませんでした。

改めて、同じスクリプトを親レコードの「新規レコード/検索条件」をしないで実行すると、子レコードに掛け率が入りました。
この検証から分かる通り、新規レコード作成してレコード確定されていない状態では、取得できない値があるようです。

トランザクション処理中のエラー番号によって挙動が変わる

トランザクションスクリプトを検証していると、エラーが発生したときにそのエラー番号によって挙動が違うことに気が付きました。
エラー番号はヘルプページで数えてみたら267個ありました。
すべてのエラー番号を検証するのは大変なので、比較的よく目にするもののみ抜粋してみました。

エラー番号 説明 エラー時の処理
1 ユーザによるキャンセル スクリプト自体が終了または続行
3 コマンドが使用できません (たとえば誤ったオペレーティングシステムや誤ったモードなど) 続行
101 レコードが見つかりません 中断して復帰
301 別のユーザがレコードを使用中です 中断して復帰
400 検索条件が空です 続行
401 検索条件に一致するレコードがありません 続行
500 日付の値が入力値の制限を満たしていません 中断して復帰
503 フィールドの値が入力値の制限オプションに指定されている範囲内に入っていません 中断して復帰
505 フィールドの値が入力値の制限オプションで要求されているようにファイル内の既存値になっていません トランザクション確定時に復帰
506 フィールドの値が入力値の制限オプションに指定されている値一覧に含まれていません 中断して復帰
507 フィールドの値が入力値の制限オプションに指定されている計算式を満たしません トランザクション確定時に復帰

「続行」は文字通りエラーが出てもそのまま続行されます。
「中断して復帰」の場合はエラーが出たスクリプトステップから「トランザクション確定」のスクリプトステップまでスキップされ、トランザクションは復帰されます。
この表の中の「505」と「507」はトランザクション処理中にはエラーは出ず、「トランザクション確定」のスクリプトステップが実行されたところで初めて評価され、トランザクションは復帰されます。

このような違いがあるので、例えばトランザクション処理中にエラーが発生した時の対処は、場合によっては実行すらされない可能性があります。
例えば、トランザクション処理中に「エラー処理[オン]」を設定せずに検索を実行して、エラー(401)ダイアログが出た場合、ユーザが「キャンセル」を選択した場合はスクリプトが終了します。

ユーザが「続行」を選択するとスクリプトは続行されますが、401エラーが出ているので次にフィールド設定などをすると、今度は101エラーが出ます。
そこでトランザクションは中断され復帰されます。
この時、401の直後の処理は実行されますが、101エラーの後のスクリプトステップはすべてスキップされます。

このように、エラー番号によってその後の挙動が変わることがあるので、エラー発生時の対応に活かしていただければと思います。

 

トランザクション処理中のレコード確定は無視される

検証のため以下のようなスクリプトを実行してみました。

「トランザクションを開く」を使っていない場合は、6行目の「レコード/検索条件確定」でレコードが確定され、その後の検索実行で検索できます。
また、6行目のレコード確定が無くても、8行目の「検索モードに切り替え」で暗黙的にレコード確定されるので、検索できます。
では、上のスクリプトを実行するとどうなるでしょうか。
答えは、検索でヒットしません。

ということは、6行目の「レコード/検索条件確定」は内部的には行われていないことになります。
また、8行目の「検索モードに切り替え」でも暗黙的にレコード確定されていることもありません。

ちなみに「レコード/検索条件確定[ダイアログあり:オン]」にしてもダイアログが出ませんでした。

レコード復帰は?

レコード確定と同じ様にレコード復帰も検証してみました。

レコード確定の時は「レコード/検索条件確定 [ ダイアログあり:オン ]」にしてもダイアログが出ませんでした。
しかし、レコード復帰の時は 「レコード/検索条件復帰 [ ダイアログあり:オン ]」 にするとダイアログが出ました。

このダイアログで復帰を押しても実際にはレコード復帰されませんでした。

トランザクション処理中は、レコード確定・レコード復帰 は無視されるようです。

 

まとめ

以上3回に渡ってClaris FileMaker 19.6の新機能のトランザクションについて見てきました。
今後も気がついたことがあれば書きたいと思っています。

みなさんも是非お試しください。

最近下記リンク先への流入増大したいこともあり、
流入量が多いとブログの価値が高まりますます投稿を加速していきたいと思います。
リンク先を開いていただけると大変助かります。
Claris International Inc. (日本語)
ご協力いただけましたら幸いです。