エラーの発生時に変更をロールバックする
学習の目的
この単元を完了すると、次のことができるようになります。
- 各フローで障害パスを使用するかどうかを判断する。
- フローに [Roll Back Records (レコードをロールバック)] 要素を追加する。
- フローに [Custom Error (カスタムエラー)] 要素を追加する。
障害パスの問題
フローには、フローの実行が部分的にしか成功しなかった場合にデータを保護する重要な組み込み機能があります。それがトランザクションのロールバックです。この機能は、そのトランザクション内で行われたすべてのデータベース変更を元に戻し、トランザクションがデータベースにコミットされる前の状態にデータを戻します。
ロールバックがどのように機能するのか、そしてどれほど重要であるかを示す例を見てみましょう。2 つの要素しかないフローを想像してください。最初の要素は取引先の状況を [Active (有効)] に更新し、2 番目の要素は顧客をオンボーディングするためのケースを作成します。フローが 2 番目の要素で失敗した場合、Salesforce は最初の要素による取引先の更新をロールバックします。ケースの作成でエラーが発生する前に取引先の更新要素は完了していますが、同一のトランザクション内の処理であるため、その取引先の更新も元に戻されます。
![前述の例に対応する図。[Create Records (レコードを作成)] 要素が失敗した場合、[Update Records (レコードを更新)] 要素と共にロールバックされます。](https://res.cloudinary.com/hy4kyit2a/f_auto,fl_lossy,q_70/learn/modules/flow-implementation-2/roll-back-changes-after-an-error/images/ja-JP/d5915a13fb91251153b1a06182a717ee_i.19.jpg)
もしトランザクションがロールバックされなければ、ケースの作成が失敗しても取引先は更新されたままです。このフローは取引先の状況を [Active (有効)] に更新しますが、オンボーディングケースは作成されないため、顧客は必要な歓迎、トレーニング、1 対 1 のサポートを受けられません。
このように、ロールバックには非常に高い価値があります。常に必要というわけではありませんが、フローが部分的に完了することで組織に問題が生じる可能性がある場合には重要です。ただし、フローのエラーによって障害パスに進んだ場合、そのトランザクションはロールバックされません。前の例で、[Create Onboarding Case (オンボーディングケースを作成)] 要素に障害パスを追加すると、ケースの作成が失敗しても取引先は更新されたままです。

レコードトリガーフローでは、さらに注意すべき点があります。障害パスがない状態でエラーが発生すると、Salesforce はエラーメッセージを表示し、フローを起動した変更をブロックします。ですが、エラーによってフローが障害パスに進んだ場合、フローが失敗していても、Salesforce はフローを起動した変更を完了させます。
幸い、Flow Builder にはフローでトランザクションを強制的にロールバックできる 2 つの要素があります。これらの要素は、それぞれ特定のフロー種別で機能します。
-
画面フロー: [Roll Back Records (レコードをロールバック)] 要素を使用します。この要素は、現在のトランザクションをロールバックするだけです。
-
レコードトリガーフロー: [Custom Error (カスタムエラー)] 要素を使用します。この要素は、設計したエラーメッセージをユーザーに表示し、現在のトランザクションをロールバックします。
次に、これらの要素を障害パスでどのように使用できるかを見ていきましょう。
画面フローに [Roll Back Records (レコードをロールバック)] 要素を追加する
「フローの実装 I」バッジでインストールしたパッケージに含まれている [Guided Opp Create (ガイド付き商談作成)] フローを確認します。
![前の単元の [Guided Opp Create (ガイド付き商談作成)] フロー。](https://res.cloudinary.com/hy4kyit2a/f_auto,fl_lossy,q_70/learn/modules/flow-implementation-2/roll-back-changes-after-an-error/images/ja-JP/0938f9c29ecff79291bbe54783410d77_i.21.jpg)
前の単元では、[Create Opportunity (商談を作成)] 要素に障害パスを追加し、エラーの詳細をユーザーに表示する画面要素を追加しました。ただし、[Create Opportunity (商談を作成)] 要素でエラーが発生しても、フローは [Hot Account (見込み有り取引先)] 要素によるレコードの変更をデータベースに保存してしまいます。これは、障害パスに進むエラーでは、前の要素で行われた変更がロールバックされないためです。そこで、[Create Opportunity (商談を作成)] 要素が失敗した場合に [Hot Account (見込み有り取引先)] の変更が保存されないように、障害パスに [Roll Back Records (レコードをロールバック)] 要素を追加しましょう。
[Roll Back Records (レコードをロールバック)] 要素を追加する
- [Guided Opp Create (商談作成ガイド)] フローを開きます。(このフローは、このバッジの前半でインストールしたパッケージに含まれています。)
- 障害パス上で、[Fault Screen (障害画面)] 要素の前にある
をクリックします。
-
[Roll Back Records (レコードをロールバック)] を選択します。
- Label (表示ラベル):
Roll Back Update and New Opp(更新と新規商談をロールバック)。
-
[Done (完了)] をクリックします。
![前述の手順に対応する [Guided Opp Create (ガイド付き商談作成)] フローの障害パス。](https://res.cloudinary.com/hy4kyit2a/f_auto,fl_lossy,q_70/learn/modules/flow-implementation-2/roll-back-changes-after-an-error/images/ja-JP/a7956daf7fb97ac66e3c77924526d988_i.24.jpg)
- フローを保存します。
これで安心です。これで、[Create Opportunity (商談を作成)] 要素が失敗した場合でも、フローは [Update Account (取引先を更新)] 要素の変更をロールバックします。
このシナリオをさらに広げてみましょう。もし [Create Opportunity (商談を作成)] 要素の後に、別の画面要素 (1) と、別の [Create Records (レコードを作成)] 要素 (2) があったらどうなるでしょうか。
![[Create Opportunity (商談を作成)] 要素の後に、追加の画面要素と [Create Records (レコードを作成)] 要素がある [Guided Opp Create (ガイド付き商談作成)] フロー。](https://res.cloudinary.com/hy4kyit2a/f_auto,fl_lossy,q_70/learn/modules/flow-implementation-2/roll-back-changes-after-an-error/images/ja-JP/0be7a8d3671122c7cfbe5d7891ad27ac_i.25.jpg)
[Roll Back Records (レコードをロールバック)] 要素は、現在のトランザクションで行われた変更のみをロールバックします。フローが画面要素に到達すると、現在のトランザクションが終了し、新しいトランザクションが開始されることを思い出してください。[Create Task (ToDo を作成)] 要素の障害パスに [Roll Back Records (レコードをロールバック)] 要素 (3) を追加しても、[Update Account (取引先を更新)] 要素や [Create Opportunity (商談を作成)] 要素 (4) の変更はロールバックされません。これらは別のトランザクションで行われたためです。
![前述の説明に対応する、[Create Task (ToDo を作成)] 要素に追加の障害パスがある [Guided Opp Create (ガイド付き商談作成)] フロー。](https://res.cloudinary.com/hy4kyit2a/f_auto,fl_lossy,q_70/learn/modules/flow-implementation-2/roll-back-changes-after-an-error/images/ja-JP/f8c1378c235810c7ee8bb4dbf08f9f59_i.26.jpg)
レコードトリガーフローに [Custom Error (カスタムエラー)] 要素を追加する
レコードトリガーフローでは、[Custom Error (カスタムエラー)] 要素を追加して、任意のエラーメッセージをユーザーに表示できます。この要素は現在のトランザクションをロールバックし、フローをトリガーした変更をブロックします。
別の例を見てみましょう。前のバッジでインストールしたパッケージに含まれている [Save At Risk Account (要注意取引先を保存)] フローは、取引先が [At Risk (要注意)] に設定されたときに実行されます。このフローは、未解決ケースを確認するよう Pyroclastic のサポートリードに指示するケースを作成し、取引先所有者が顧客に連絡するための ToDo を作成します。これらの手順はいずれも取引先を維持するために重要です。すべてのレコードが確実に作成されるように、[Custom Error (カスタムエラー)] 要素を含む障害パスを追加しましょう。
[Custom Error (カスタムエラー)] 要素を追加する
- [Save At Risk Account (要注意取引先を保存)] フローを開きます。
- [Create Case (ケースを作成)] 要素をクリックします。
-
[Add Fault Path (障害パスを追加)] を選択します。
- 障害パスで
をクリックします。
-
[Custom Error (カスタムエラー)] を選択します。
- Label (表示ラベル):
Error and Roll Back(エラーとロールバック)。
- Where to Show the Error Message (エラーメッセージの表示場所) で、[In a window on a record page (レコードページのウィンドウで)] が選択されていることを確認します。
- [Error Message (エラーメッセージ)] セクションで、[Resource Picker (リソースピッカー)] 項目の下の入力欄に次の内容を入力します。
Please send this error message to the Salesforce admin team. (次のエラーメッセージを Salesforce 管理チームに送信してください。) {!$Flow.FaultMessage}
- キャンバスで [Create Task (ToDo を作成)] 要素をクリックします。
-
[Add Fault Path (障害パスを追加)] を選択します。
- 新しい障害パスで
をクリックします。
-
[Connect to element (要素に接続)] を選択します。
- [Error and Roll Back (エラーとロールバック)] 要素の
をクリックします。
これにより、2 つの障害パスが実質的に統合され、どちらの [Create Records (レコードを作成)] 要素が失敗しても同じ [Custom Error (カスタムエラー)] 要素が使用されます。
- フローを保存します。
![前述の手順に対応する [Save At Risk Account (要注意取引先を保存)] フロー。](https://res.cloudinary.com/hy4kyit2a/f_auto,fl_lossy,q_70/learn/modules/flow-implementation-2/roll-back-changes-after-an-error/images/ja-JP/47b6620954f812f71bb62de053489a49_i.33.jpg)
以後、このフローがトリガーされるような変更をユーザーが行い、フローでケースまたは ToDo の作成に失敗した場合には、その変更がブロックされ、フロー全体がロールバックされて、詳細なエラーメッセージが見やすい場所に表示されるようになります。
![状況が [At Risk (要注意)] に変更された取引先。前述の手順で設定したエラーが表示されています。](https://res.cloudinary.com/hy4kyit2a/f_auto,fl_lossy,q_70/learn/modules/flow-implementation-2/roll-back-changes-after-an-error/images/ja-JP/42ffb45b3e2ac23d23b93c43ac1122d7_i.34.jpg)
障害パス以外で [Custom Error (カスタムエラー)] を使用する
[Custom Error (カスタムエラー)] 要素を使用するのは障害パスだけではありません。通常のフローパスに配置して、フローでエラーが発生していない場合でも実行できます。[Custom Error (カスタムエラー)] 要素は、現在のトランザクションをロールバックし、フローをトリガーした変更をブロックすることを思い出してください。これらの機能を使用して、フローの完了やトリガーレコードの変更を制御できます。
たとえば Pyroclastic Inc. では、ユーザーに取引先の削除を許可していますが、取引先の状況が [Prospect (見込み客)] に設定されていない場合は削除を禁止したいと考えています。通常、Salesforce でレコードの変更を禁止するには、システム管理者が入力規則を作成します。ただし、入力規則はレコードの削除ではトリガーされません。では、削除を防止するにはどうすればよいでしょうか。
レコードトリガーフローは、レコードの削除によってもトリガーできます。そこで、状況が [Prospect (見込み客)] ではない取引先が削除されたときに実行されるレコードトリガーフローを作成します。そのフローに [Custom Error (カスタムエラー)] 要素を追加します。取引先が不適切に削除されると、フローがトリガーされます。カスタムエラーメッセージが表示され、取引先の削除がブロックされます。

習得度チェック
以下の習得度チェックは採点されません。ハンズオン Challenge を完了する前に、フローエラー、障害パス、ロールバックに関連する Salesforce の動作についての理解度を確認するための、簡単な自己チェックです。開始するには、右側の列にある説明を、左側の対応するシナリオの隣にある [Behavior (動作)] 列へドラッグします。全アイテムを結び付けたら、[送信] をクリックして習得度をチェックします。もう一度挑戦する場合は、[リセット] をクリックしてください。
リソース
