トリガの中でtrigger.newをfor文で回して、レコードの項目の値を取得することは頻繁にあると思います。
そしてその処理の中で、取得した項目値がnullとなってしまうケースが存在します。
それがtrigger.newから関連レコードの項目値を取得しようとした時です。
目次
trigger.newでの関連レコードの項目取得
以下のContactトリガでは、取引先責任者が新規作成された際にtrigger.newをfor文で回し、その取引先責任者に紐づく取引先の名前を参照しようとしています。
trigger ContactTrigger on Contact (before insert) {
for(Contact con : trigger.new){
system.debug(con.LastName);
system.debug(con.Account.Name);
}
}
デバッグログの結果を見ると、以下のようになりました。
USER_DEBUG [4]|DEBUG|取引先責任者01
USER_DEBUG [5]|DEBUG|null
取引先責任者の氏名は取得できていますが、紐づく取引先の取引先名はnullとなってしまいます。
このようにtrigger.newからtrigger.newの項目値はもちろん取得できますが、そのレコードに関連するレコードの項目値は取得できません。
対応策
では、関連レコードの値はどのように取得するかというと、以下のように一度SOQLを発行して取得する必要があります。
trigger ContactTrigger on Contact (before insert) {
Set<Id> accIdSet = new Set<Id>();
for(Contact con : trigger.new){
accIdSet.add(con.AccountId);
}
//取引先情報を取得
for(Account acc : [Select Name From Account Where Id IN: accIdSet]){
system.debug(acc.Name);
}
}
USER_DEBUG [11]|DEBUG|取引先01
これは割と忘れがちな内容ですね。
後続の処理でNullPointerExceptionが発生し、ようやく気付くこともしばしば。
trigger.newから関連レコードの項目値を取得する際は、お気を付けください~
コメント