例外処理とエラー時ロールバックを処理する
学習の目的
この単元を完了すると、次のことができるようになります。
- ステップが失敗した場合に、管理パッケージ用 Omnistudio で Try Catch Block を使用してエラーを特定する方法を説明する。
- Rollback On Error を使用する場合について説明する。
- カスタム権限を使用して特定のチームにデータアクセス権を付与する方法を説明する。
新しい要件、新しいスキル
ここまで、ClearLight の要望に応えるために Robert が新しいメンバーポータル機能を追加する取り組みを見てきました。また、営業チームが大規模トランザクションを処理できるようにソリューションを改善しました。
すべての処理時間の長い Integration Procedure が円滑に実行されるように更新もしました。
ClearLight プロジェクトの最終フェーズは、営業チーム向けに新しいカスタマー取引先と商談をモバイルデバイスから作成できるアプリケーションを作成することです。このニーズを満たすために、Robert はローコード API ビルダーで REST API を作成し、Salesforce でホストするつもりです。
次のことを実現する必要があります。
- 商談の作成が失敗したら、トランザクションは取引先レコードの作成をロールバックする。
- エラーが発生したら、REST API は会社で定義されたエラーコードとメッセージを返す。
- 営業チームの特定のグループのみが REST API にアクセスできる。
そのため、例外処理とエラー時のロールバック (Rollback On Error) に取り組む必要があります。
この要件を満たすために Robert が Integration Procedure と Data Mapper Load を構成する手順を一緒に見ていきましょう。
Rollback on Error (エラー時ロールバック) 構成
Data Mapper Load は JSON、XML、またはカスタムインプットフォーマットのデータを受け入れ、データを Salesforce オブジェクトに出力します。Data Mapper Load は呼び出されると、マッピングと数式をインプットデータに適用してアウトプットデータを作成します。そのアウトプットデータをマッピングに従って Salesforce オブジェクトに読み込みます。
Robert の最初のユースケースでは、商談の作成が失敗したら、トランザクションが取引先レコードの作成をロールバックする必要があります。
この機能を作成するには、次のことをする必要があります。
- 親-子リレーションの保存をサポートする Data Mapper Load を作成する。
- Data Mapper Load を構成する。
- Rollback On Error オプションを実装する。
では、Rollback On Error の構成から始めましょう。
Data Mapper Load で [Objects (オブジェクト)] タブ (1) を選択します。更新する Salesforce オブジェクトを指定します。この場合、Account (取引先) レコード (2) と Opportunity (商談) レコード (3) を作成します。
[Options (オプション)] タブ (1) を選択し、設定を検討します。
- Ignore Errors (エラーを無視) (2): ステップでエラーが発生しても Data Mapper は実行を継続します。たとえば、Account ステップの取引先レコードの作成でエラーが発生しても、Data Mapper プロセスは次のステップに進み、商談レコードを作成します。
- Rollback On Error (エラー時ロールバック) (3): エラーが発生したら、Data Mapper はすべての更新をロールバックします。
- Use Assignment Rules (割り当てルールを使用) (4): ケースが割り当てられたら、構成されたルールに基づいて Data Mapper がユーザーにメール通知を送信します。
- Overwrite Target For All Null Inputs (すべての null インプットに対して対象を上書き) (5): デフォルトで、値が null の場合、Data Mapper はアウトプット JSON にその項目のノードを作成しません。
[Rollback On Error (エラー時ロールバック)] を選択します。
どうなるかプレビューしましょう。
- [Preview (プレビュー)] (1) タブに移動して Data Mapper Load を実行します。[Objects Created (作成されたオブジェクト)] (2) セクションに商談レコードが表示されていません。
- [Errors (エラー)] (3) セクションを展開してエラーメッセージをチェックします。この例のエラーは、完了予定日がないことを示しています。
エラーは商談の保存時に発生したため、トランザクションは取引先レコードをロールバックしました。
Try Catch Block 構成
Robert は快調に Rollback On Error を設定し、次の要件に進んでいます。エラーが発生したら、API はクライアントが定義したエラーコードとメッセージを返す必要があります。Try Catch Block では、ブロック内でステップの実行を try し、ステップが失敗したらエラーを catch します。Robert は試してみることにしました。
Try Catch Block にエラーコードとメッセージを設定する方法を見ていきましょう。
-
Try Catch Block (1) を [Structure (構造)] パネルにドラッグします。
- [Failure Response (失敗時レスポンス)] (2) に、Try Catch Block が失敗した場合にレスポンスで返す値を指定します。
-
[Add Key/Value Pair (値/キーペアを追加)] を選択します。
- キーを
ErrorCode
、値を001
に設定します。
- もう 1 つキー/値ペアを追加してエラーメッセージを指定します。キーを
Message
、値をError rollback all transactions
(エラー時にすべてのトランザクションをロールバック) に設定します。
- もう 1 つキー/値ペアを追加し、キーを
Detail
、値を%CreateAccountAndOpportunity:errors%
に設定します。
- [Custom Failure Response (カスタム失敗時レスポンス)] セクションで、[Fail On Block Error (ブロックエラー時に失敗)] (3) を選択します。
どうなるかを確認してみましょう。
[Preview (プレビュー)] (1) タブに移動し、ErrorCode、Message、Detail が [Response (レスポンス)] (2) セクションで返されていることを確認します。
Rollback on Error の有効化
トランザクション境界内部で発生する操作は、操作の 1 つの単位に相当します。トランザクション内のすべての操作がエラーなしで実行を完了した後にのみ、すべての変更がデータベースにコミットされます。Rollback On Error オプションが有効な中間ステップのいずれかでエラーが発生した場合、すべてのデータベース変更はロールバックされ、トランザクションはコミットされません。
簡単に言うと、Omniscript から sObject のデータの変更、更新、作成が要求されたら、要求全体が正常に完了した場合にのみ、すべての変更はデータベースにコミットされます。
[Rollback On Error (エラー時ロールバック)] オプションに再び目を向けましょう。
[Structure (構造)] パネルの [Procedure Configuration (プロシージャー構成)] (1) で、[Rollback On Error (エラー時ロールバック)] (2) を選択します。
この例では、2 つのトランザクションを含む Integration Procedure が表示されています。最初のトランザクション (1) では取引先の作成と更新、2 つ目のトランザクション (2) では商談の作成と更新を行います。両方のトランザクションが作成されて更新されると、Integration Procedure の実行は成功になります。一方のトランザクションのみが失敗した場合、作成されたもう一方のトランザクションでもロールバックを行います。
この例では Try Catch Block Account Creation は正常に作成されて更新されます。Try Catch Block Opportunity Creation でエラーが発生した場合、トランザクションは Account Creation をロールバックします。
Integration Procedure REST API
Data Mapper の作成と Integration Procedure の有効化によって HTTP メソッド (GET、POST など) をサポートする REST API エンドポイントが作成されます。
Workbench に入力するエンドポイント URL は次のようになります。
- Data Mapper の REST API は、このエンドポイントを使って使用できます:
/services/apexrest/{namespace}/v2/DataMapper/{DataMapperName}/
- 例: AccountOpportunityLoad という名前の Data Mapper のエンドポイント URL:
/services/apexrest/vlocity_ins/v2/Data/AccountOpportunityLoad/
- Type (タイプ) = sample で SubType (サブタイプ) = CreateOpportunity の Integration Procedure のエンドポイント URL:
/services/apexrest/vlocity_ins/v1/integrationprocedure/sample_CreateOpportunity/
- Integration Procedure のエンドポイント:
/services/apexrest/{namespace}/v1/integrationprocedure/{Type}_{SubType}/
Workbench (1) で Integration Procedure を実行します。Workbench を開き、REST Explorer (2) を選択します。[Select (選択)] (3) をクリックして続行します。
REST API で実行する HTTP メソッド (1) を選択します。インプット項目 (2) にエンドポイント URL を入力し、[Execute (実行)] (3) を選択してレスポンスを表示します。
[Request Body (リクエストボディ)] (1) セクションにインプットを入力すると、[Raw Response (未加工レスポンス)] (2) セクションに結果が表示されます。
カスタム権限構成
Robert はついに最後のプロジェクト要件に取りかかります。REST API を特定のグループのみからアクセス可能にする必要があります。この例では、AccountOpportunityLoad Data Mapper と OpportunityCreation Integration Procedure へのアクセスを限定するカスタム権限について見ていきます。
営業チームには CreateOpportunity Integration Procedure REST API へのアクセス権のみ、内部システム管理者チームには AccountOpportunityLoad DataMapperLoad REST API へのアクセス権のみを付与する必要があります。
親の OpportunityCreation Integration Procedure には、Data Mapper Load Action を通じて自動的に AccountOpportunity Data Mapper へのアクセス権が付与されることを理解しておきます。
カスタム権限を使用して特定のチームにレコードアクセス権を付与する方法を学習しましょう。
-
[Setup (設定)] | [Custom Permissions (カスタム権限)] (1) に移動します。
- InternalAdmin (内部システム管理者) (2) と SalesTeam (営業チーム) (3) の新規カスタム権限を作成します。
- カスタム権限を Data Mapper に割り当てます。
新しい Data Mapper (1) を作成し、[Required Permission (必須権限)] (2) 項目に InternalAdmin
と入力します。
次は、SalesTeam の [Custom Permission (カスタム権限)] を構成します。CreateOpportunity Integration Procedure への権限を割り当てます。
- 新規 Integration Procedure (1) を作成します。
- [Required Permission (必須権限)] (2) 項目に「SalesTeam」と入力します。
Robert はエラーと例外の処理のエキスパートになりました。プロジェクトの要件をすべて実現したことでかなり自信がつきました。また、手順を一緒に見ていくことで、Integration Procedure のいくつかの高度な機能の使い方についても知識が深まりました。
リソース