こんにちは。まるです。
最近スマホのバッテリーがあっという間に無くなってしまうので、いい加減買い替えようかなと考えている次第です。
小さいスマホの方が持ちやすくて好きなので、iPhone12 miniがとても気になります。
さて、今回も引き続きSalesforce開発について見ていきます。
Apexトリガとは、Salesforceのレコード(データ)に対して何らかのイベント(作成、更新、削除)が発生した際に、そのイベントを引き金としてアクションを実行できる仕組みのことです。
基本的な構文としては、以下のようになります。
Trigger トリガ名 on オブジェクト名(イベント条件) {
アクション内容
}
実際に書いてみます。
以下は、取引先オブジェクトに関連する「TestTrigger」という名前のトリガーです。
trigger TestTrigger on Account (before insert, before update) { System.debug('Hello World!'); }
イベント条件の箇所には、以下の内容を指定できます。
・before insert
・before update
・before delete
・after insert
・after update
・after delete
・after undelete
これらのうち、頭にbeforeとついているのがbeforeトリガ、afterとついているのがafterトリガです。
この二種類のトリガには以下のような違いがあります。
beforeトリガ | レコードがデータベースに保存される前に起動する |
afterトリガ | レコードがデータベースに保存された後に起動する |
よって、今回の例の”before insert, before update”は、「レコードを作成または更新した際に、そのレコードがデータベースに保存される前に{}内の処理を実施する」という条件になります。
ちなみにafterトリガはデータベースに保存後に処理を実行するため、「最終更新日」や「最終更新者」など保存時にシステムによって設定される値を利用することが出来ます。
ex) {}内の処理で、”「最終更新者」のプロファイルがシステム管理者の場合のみ実行”というようなif文を作れる
さて、先ほどの例で無事「TestTrigger」トリガを作成することが出来ました。
こちらのトリガはレコードを作成または更新した際に起動するよう条件が指定されていますが、レコード作成時と更新時で処理を分けたい場合はこのままだと困りますね。
こんな時に役立つのが、コンテキスト変数です。
trigger TestTrigger on Account (before insert, before update) { if(Trigger.isInsert) { System.debug('新規作成です'); } if(Trigger.isUpdate) { System.debug('更新です'); } }
if文の条件にTrigger.〇〇という形式で記述されいているのがコンテキスト変数です。
“isInsert“はレコードの作成処理によりこのトリガが呼び出された場合に”true”を返し、
“isUpdate“はレコードの更新処理によりこのトリガが呼び出された場合に”true”を返します。
トリガにはこの他にも便利なコンテキスト変数が用意されています。
※こちらの公式ドキュメントでまとめられているので、詳細は割愛します。
以下は、Salesforceでレコードの作成・更新・削除が行われた際に実行される自動処理の実行順序です。
※詳細についてはこちらを参照ください。
1 .元レコードの読み込み、または更新用にレコードを初期化
2 .レコードの値を上書き
3 .保存前更新を実行するフローの実行
4 .beforeトリガの実行
5 .入力規則の実行
6 .重複ルールの実行
7 .レコードをデータベースに保存(未コミット)
8 .afterトリガの実行
9 .割り当てルールの実行
10.自動応答ルールの実行
11.ワークフロールールの実行
12.ワークフロー項目自動更新が存在する場合、レコードを再更新
13.12の再更新を受けて、before updateトリガ・after updateトリガを再実行
14.プロセスから起動されたプロセスとフローの実行
15.エスカレーションルールの実行
16.エンタイトルメントルールの実行
17.積み上げ集計数式の値の更新
18.条件に基づく共有の評価の実行
19.全てのDML操作のコミット
20.コミット後のロジックの実行
なんだか色々な処理がありますが、今回のメインはトリガなのでbeforeトリガとafterトリガに注目します。
実際の開発で影響が大きそうなのは、5の入力規則の実行です。
これはbeforeトリガの実行後、且つafterトリガの実行前に行われています。
つまり、beforeトリガ行った処理は入力規則で制御出来ません。
新規作成時はあえて入力規則を無視してレコードを登録させたいなど、仕様によっては便利に使いこなせそうですが、意識しておかないと掛かるはずの入力規則が掛かってないという事態にもなりかねないので気を付けたいと思います。
トリガを使うことによって、ユーザがただレコードを作成・更新するだけで自動で動くという大変便利な処理が実現できるので、是非ともマスターしたいところです。
また、便利である分ほかの機能や処理に与える影響も少なくないので、意識しながら開発を行いたいと思います。
今回はここまでです。
有難うございました!