tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:Apexトリガーのエラー判定について

Apexトリガーのafter triggerのタイミングでDML処理を実行した際に入力規則によるエラーが発生すると次のようなエラーメッセージが表示されてしまいます。

f:id:tyoshikawa1106:20140223040016p:plain


ちょっとした入力漏れなどで入力規則に引っかかってしまった時に、このようなエラーメッセージが表示されてしまうとちょっと残念な感じになってしまいます。


この問題を回避するにはただUpdateを行うのではなく、Database.UpdateのようにDatabase ClassをつかったDML処理を実行することで回避ができます。


Database ClassによるDML処理はExceptionエラーが発生したときでも処理を中断せずにDatabase.Saveresultというデータ型に値を保持してくれています。


Database.Saveresultでは「isSuccess()」でエラーの有無を確認することができ、Database.Errorでエラーの情報を取得することが可能になります。


次のような感じでDatabase.Saveresultのリストをループしながらエラーレコードをチェックしていき、エラーレコードに対してはaddErrorでエラーメッセ―ジを表示させるようにします。


Database.ErrorのgetMessage()をつかうことで入力規則のエラーメッセージのみを画面に表示させることができます。

f:id:tyoshikawa1106:20140223041026p:plain

入力規則の設定

f:id:tyoshikawa1106:20140223041051p:plain


こんな感じできちんとエラー判定を行なってあげるとSalesforceを快適に利用していけると思います。


ちなみにafter triggerでは基本的に更新されたオブジェクトを元に別のオブジェクトに対して登録、更新処理を行うことになると思います。


別オブジェクトのエラー時に元のオブジェクトに対してaddErrorを行いたい場合は、標準で用意されているtrigger.newMap / trigger.oldMapが便利です。


こちらのサイトに乗っているコードがtrigger.newMap使用時の参考になると思います。

salesforce - Apex Managed Sharing trigger stopped working when changed field from Lookup to Master-Detail - Stack Overflow