S.B.S. Salesforce技術ブログ

教えて921さん!

トリガーの作成をしよう#6~実際に書いてみよう~

こんにちは、Nambuです。今回も引き続きトリガについて説明したいと思います。#6では簡単な処理ながら実際にトリガを一緒に書いてみたいと思います。

トリガのよくある利用方法


まず、トリガを書く前にbeforeトリガとafterトリガそれぞれでどんな処理をやることが多いか紹介したいと思います。
before処理ではオブジェクトマネージャーの入力規則では設定できないような複雑な入力チェック(重複チェックやレコードをまたいだチェック)やレコードの紐づけをやることがあります。
次にafter処理ではレコードを追加、メール送信、WebAPIの実行(データの連携)などをやることがあります。

簡単なトリガを書いてみよう


それでは上記で上げたような複雑な処理ではないですがトリガを実際に書いていきたいと思います。具体的な処理内容としてはbefore処理では項目の値を上書きします。after処理では参照関係にある子オブジェクトのレコードを新規作成したいと思います。また、トリガを書くにあたって#5で説明したトリガハンドラのソースコードをテンプレとして利用したいと思います。 初めにbeforeの部分の処理について記述していきます。トリガクラスから引数を通して受け取った処理対象のレコードのリストで拡張for文を回します。このように拡張for文を利用することで処理しなければいけないレコード全てを対象に取ることができます。 次にこのfor文の中に処理を書いていきます。今回は項目の値を変更するという単純な動作なので項目の値を代入で編集します。 before updateの方にも同じように処理を書いていきます。ここで注意点ですが#3でも説明した通り、値を代入にて直接変更することができるのはデータを登録する前のbeforeトリガのみであり、もしafterトリガで同じような処理を行おうとする場合は、SOQLのupdate処理を記述する必要があります。 続いてafterトリガの処理を書いていきます。ここでは子オブジェクトのレコードを新規作成するので、新規作成したレコードを保存しinsertするために使うリストを用意します。リストを用意して一括でinsertするのではなく拡張for文の中で都度insert処理をしてしまうと簡単にガバナ制限に引っかかってします恐れがあります。 拡張for文の中では子オブジェクトの変数を新規に作り必要な項目に値を入れていきます。この時に参照関係を作るために処理対象のレコードのIDを参照項目に代入していきます。これはすでにデータが登録されているafterトリガだから出来るといえます。 そして、作ったレコードはあらかじめ用意したリストにしまっていき、メソッドの最後でinsertを行います。 after updateにも同じような処理を書いていき、次からは実際の動作の様子を見ていきたいと思います。 トリガの起動対象にしたオブジェクトにて新規レコードを作成します。項目にはそれぞれHatenaと入力しておいて保存を押します。 すると、作成されたレコードのbefore insertという項目の値が先ほど作ったメソッドの処理により書き換わっていることが分かります。 次に関連リストを見てみるとdoトリガオブジェクトに新しくレコードが作成されているのも確認できます。 続いて先ほど作成したレコードを編集して保存します。 するとbefore updateに記載した処理の通りに項目が上書きされます。 また関連リストを見てみるとafter updateによりもう一つレコードが新規作成されているのが確認できます。