2021/06/28

Salesforce ApexのTrigger.newの役割と使い方を紹介

 
  

Salesforce ApexのTrigger.newとは

Trigger.newは、Salesforce ApexのTrigger クラスに含まれるトリガコンテキスト変数のひとつです。Apexでは、Trigger クラスを使用してトリガのランタイムコンテキスト情報にアクセスします。

Salesforce Apexにおけるトリガとは

Salesforceでは、Apexトリガを使用して、Salesforceレコードを変更する前後に、挿入、更新、削除アクションを実行できます。 <トリガが実行される操作> ・insert ・update ・delete ・merge ・upsert ・undelete

Salesforce Apexトリガの種類

Salesforce Apexトリガには、beforeトリガとafterトリガの2種類があります。Trigger.newは、どのトリガにおいても使用できます。 beforeトリガ レコードがデータベースに保存される前に、レコードの値を更新もしくは検証できます。 afterトリガ 他のレコードの変更に影響を及ぼす場合に使用します。afterトリガの対象となるレコードは参照のみです。 例) ・レコードのIDやLastModifiedDate項目などのシステムが設定した項目値へのアクセス ・監査テーブルへのログイン、キューを使用した非同期イベントの実行

Salesforce Apexトリガのランタイムエラー

Salesforce Apexトリガを使用して以下の操作を実行すると、直接操作、間接操作のいずれの場合も、ランタイムエラーが発生します。 ・beforeトリガでのレコード更新もしくは削除 ・afterトリガでのレコード削除

Salesforce ApexにおけるTrigger.newの機能と留意点

Trigger.newは、トリガを実行するレコードにアクセスするトリガコンテキスト変数で、登録、更新、削除された後の状態のsObjectを取得します。 Salesforce Apexのトリガは、1件のレコードを挿入、もしくはAPIや Apexを使用してレコードを一括挿入した場合に実行されます。そのため、Trigger.newを含むコンテキスト変数では、レコード1件のみの場合と複数レコードを含む場合があります。 Trigger.newと対になる機能をもつTrigger.oldというトリガコンテキスト変数があります。こちらは登録、更新、削除される前の状態のsObjectを取得します。

Trigger.newの機能

Trigger.newは、登録、更新、削除を実行した後のバージョンのsObjectレコードのリストを返します。 Trigger.newで取得したsObjectリストを使用できるのは、 insertトリガ、updateトリガ、undeleteトリガです。また、beforeトリガでのみレコードを変更できます。 Trigger.newの反復処理を行うことで、個々のsObjectを取得できます。

Trigger.newを使用する際の留意点

Salesforce Apexで、Trigger.newを使用する際の留意点を説明します。 Trigger.newは、Apex DML操作では使用できません。Trigger.oldも同様です。その他にTrigger.newを使用する際は、以下の点について注意しなければなりません。 ・Trigger.newを使用してオブジェクトの項目値を変更できるのは、beforeトリガのみです。 ・afterトリガで実行する際、例外的に保存されないケースがあります。 ・Trigger.newの削除はできません。

Trigger.newを使用した項目の変更

Trigger.newを使用した項目は、トリガイベントによって変更できない場合があります。 before insertトリガ、before updateトリガでは変更できますが、after insertトリガ、after undeleteトリガでは変更できず、Trigger.newを保存しているため、ランタイムエラーが発生します。また、Trigger.newは、before deleteトリガ、after deleteトリガでは使用できません。

Salesforce ApexのTrigger.newの使い方

Trigger.new の使用例を紹介します。シンプルにワークフローなどにより更新されたsObjectを取得するほか、Trigger.oldとの組み合わせで使用できます。

使用例① Trigger.newにより、SalesforceのsObjectを取得する

Trigger.newを使用して、sObjectリストを取得するシンプルなトリガです。for ループを使用して反復処理でき、SOQLクエリのIN句を用いて、バインド変数としても使用できます。 変数の例として、Sample、Sample a、A、B、SampleIdを使用しています。

Trigger.new のサンプルコード

以下がTrigger.new のサンプルコードです。
Trigger simpleTrigger on Sample (after insert) {
    for (Sample a : Trigger.new) {
        // Iterate over each sObject
    }

    // This single query finds every contact that is associated with any of the
    // triggering accounts. Note that although Trigger.new is a collection of
    // records, when used as a bind variable in a SOQL query, Apex automatically
    // transforms the list of records into a list of corresponding Ids.
    Contact[] cons = [SELECT A FROM B
                      WHERE SampleId IN :Trigger.new];
}

使用例② Trigger.newとTrigger.oldで更新前後の値を比較する

Trigger.newとTrigger.oldを組み合わせた使用例を紹介します。項目の自動更新を行うワークフローを作成し、その結果をデバッグログとして表示します。 ここでは 、[説明] 項目などの更新を実行するオブジェクト作成のワークフローを例にします。trigger.oldにより、変更された項目を取得することを前提としています。 トリガは、ワークフローが更新されると起動し、反復処理により変更された [説明] 項目を取得します。このトリガで取得する項目を、別の方法で取得するには、ワークフローが実行された後でデータベースをクエリしなければなりません。 <処理の流れ> ①ワークフローの更新により項目値が変更されます。 ② trigger.oldとtrigger.newを使用して、レコードの該当する項目の新旧バージョン(更新前、更新後)の値を比較します。 ③それに応じて必要なビジネスロジックを実行します。

Trigger.newとTrigger.old のサンプルコード

以下がTrigger.newとTrigger.old のサンプルコードです。
{
    if (Trigger.isBefore) {
        System.debug('********Trigger values***********');
        System.debug('***SFDC: Trigger.old is: ' + Trigger.old);
        System.debug('***SFDC: Trigger.new is: ' + Trigger.new);
    }

    if (Trigger.isAfter) {
        System.debug('********Trigger values***********');
        System.debug('***SFDC: Trigger.old is: ' + Trigger.old);
        System.debug('***SFDC: Trigger.new is: ' + Trigger.new);

    }
}

SalesforceのTrigger.newでできること

今回は、Salesforce ApexのTrigger.newについて紹介しました。 Trigger.newは、登録、更新、削除が実行された後の項目値を取得するトリガコンテキスト変数です。同じく、登録、更新、削除前の項目値を取得するTrigger.oldと組み合わせて使用するなど、利便性が高いです。 Trigger.newを含むトリガコンテキスト変数を理解できると、Apexの活用がより広がるでしょう。]]>

ITエンジニアへのキャリアチェンジならキャリアチェンジアカデミー

この記事の監修者・著者

株式会社オープンアップITエンジニア
株式会社オープンアップITエンジニア
未経験からITエンジニアへのキャリアチェンジを支援するサイト「キャリアチェンジアカデミー」を運営。これまで4500人以上のITエンジニアを未経験から育成・排出してきました。
・AWS、salesforce、LPICの合計認定資格取得件数:2100以上(2023年6月時点)
・AWS Japan Certification Award 2020 ライジングスター of the Year 受賞

おすすめの動画

  • 【未経験からIT業界へ転職するなら】相談窓口とスキルの獲得はここで解決!IT転職が一気に有利に!【キャリアチェンジアカデミー】

  • 【費用一切不要】未経験からIT業界へ転職するならまずはここへ相談!【キャリアチェンジアカデミー】

  • 【何のエンジニアになれるのか?】未経験からITエンジニアを目指すとこんな道がある【キャリアチェンジアカデミー】