function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
慈 小堀慈 小堀 

System.NullPointerException: Attempt to de-reference a null object・・のエラー

商談のトリガで以下のように書きましたところ、エラーがでました。
CopyOpportunityYakuwari: execution of AfterInsert caused by: System.NullPointerException: Attempt to de-reference a null object: Trigger.CopyOpportunityYakuwari: line 7, column 1
ご教授お願いします。

trigger CopyOpportunityYakuwari on Opportunity (after Insert) {

    for(Integer i=0; i<Trigger.new.size(); i++){
       Opportunity nw  = Trigger.new[i];
       Opportunity old = Trigger.old[i];
    
            /*
             * 「取引先責任者の役割」をコピー
             */
            List<OpportunityContactRole> contactRoleList = [
                SELECT
                  ContactId,
                  Role,
                  IsPrimary
                FROM
                  OpportunityContactRole
                WHERE
                  OpportunityId = :'old.id'
                                    
            ];
            
            List<OpportunityContactRole> newContactRoleList = new List<OpportunityContactRole>();
            for (OpportunityContactRole contactRole : contactRoleList) {
                newContactRoleList.add(new OpportunityContactRole(
                  OpportunityId = 'nw.id',
                  ContactId = contactRole.contactId,
                  Role = contactRole.role,
                  IsPrimary = contactRole.isPrimary
                ));
            }
            insert newContactRoleList;
        }
}
Best Answer chosen by 慈 小堀
Ryosuke KobayashiRyosuke Kobayashi
初めまして。

■エラーについて
Opportunity old = Trigger.old[i];
⇒Insertトリガーでは、Trigger.Oldは利用できません。
新規登録なので、レコードの前情報がないためです。

■エラーの原因ではありませんが
OpportunityId = :'old.id'
⇒正しくは、「OpportunityId = :old.id」です。
シングルクォートは不要です。

■本題
前の質問も参照しましたが、トリガーでの実装ではなく、
Apexで独自のコピー機能を実装するやり方のほうが、
シンプルになると思いますが、トリガーで実装しなければいけない理由があるのでしょうか?

All Answers

Ryosuke KobayashiRyosuke Kobayashi
初めまして。

■エラーについて
Opportunity old = Trigger.old[i];
⇒Insertトリガーでは、Trigger.Oldは利用できません。
新規登録なので、レコードの前情報がないためです。

■エラーの原因ではありませんが
OpportunityId = :'old.id'
⇒正しくは、「OpportunityId = :old.id」です。
シングルクォートは不要です。

■本題
前の質問も参照しましたが、トリガーでの実装ではなく、
Apexで独自のコピー機能を実装するやり方のほうが、
シンプルになると思いますが、トリガーで実装しなければいけない理由があるのでしょうか?
This was selected as the best answer
慈 小堀慈 小堀

Ryosuke Kobayashi様
返信ありがとうございます。

Trigger.Old利用できないことが理解できました。別の項目の値をひきついで対応できました。

Apexでコピー機能を作成すると、ボタンを押すとすでにデータが出来てしまうのを避けたく、トリガにしてみました。

ありがとうございましたm(__)m