' P '

whatever I will forget

Salesforce Apex Speclialist メモ

Apex Trigger

Before / After Triggerの違い

  • Before Trigger

    • DMLがCommitされる前に実行される.
    • 入力規則が更新したいオブジェクトに設定されている場合.
    • 新規作成、更新をトリガされた同じオブジェクトで行う場合.
  • After Trigger

    • DMLがCommitされた後に実行される.
    • 新規作成、更新をトリガされた関連オブジェクトで行う場合.
    • メール通知を行いたい場合.
    • トリガされた同じレコードはRead Onlyとなる(すでにCommitされているため).

トリガコンテキスト変数

  • トリガされたTriggerのコンテキスト(実行された状態)によって if分岐などが可能.
  • Trigger.isUpdateとか.
    developer.salesforce.com

SOQL

  • イマイチSalesforce流のJOINとかがわかっていない.
  • カスタム項目でLookupで他オブジェクトとの関連項目を作成した場合、そのオブジェクトがとなる.
  • 子から親を参照する場合、子にあるカスタムLookup項目は Idしか取得できないので、他項目を取得したい場合は、__rが必要.
  • カスタムオブジェクト(子) → 標準オブジェクト(親)のSOQLをしたい場合でも、__rが必要になる.
  • 下記例は、AccountにLookupしているClient__cというカスタム項目と、AccountNameを取得する場合の例.
  • Client__rはどこからやってくるかというと、Client__cのカスタム項目名となる.
SELECT Id, Client__c, Client__r.Name FROM ChildObj__c

dackdive.hateblo.jp

ApexでのParent - ChildでのSOQL

  • 親から子テーブルを参照するときに、どうやってApexで子オブジェクトの項目にアクセスするのか不明でした.
  • 例えば、accをDebugしても、AccountのIdしか取得できない.
  • そのため、子オブジェクトを再度ループさせて取得する必要がある.
List<Account> acct = [SELECT id, (SELECT id FROM Contacts) FROM Account LIMIT 3];
for(Account acc : acct) {
    System.debug(acc);
    for(Contact c : acc.Contacts) {
        System.debug(c);
    }
}

www.sfdcpoint.com