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
iwakiiwaki 

参照先オブジェクトを更新する場合のapexトリガー設定方法

お世話になっております。
取引先責任者を参照するカスタムオブジェクト(education_training__c)のレコードが更新されたとき同じ取引先責任者を参照するレコードの値を
結合して、取引先責任者のカスタム項目に反映するという更新処理をapexで実装したいと考えております。
匿名ウィンドウでapexを実際に検証したところ上手く動作したのですがトリガを設定して、カスタムオブジェクトのレコードを編集してみたところ、以下のエラーが表示されました。

「エラー:Apex トリガであるsetTrainingHistoryTriggerで予期せぬ例外が発生しました。システム管理者にお問い合わせください。setTrainingHistoryTrigger: execution of AfterUpdate caused by: System.ListException: List index out of bounds: 0: Class.setTrainingHistory.setTrainingHistory: line 11, column 1」

トリガとクラスは以下のように記載しています。
知識がないのがお恥ずかしい限りですが、解決方法をご教示くだされば幸いです。よろしくお願いいたします。

トリガ
trigger setTrainingHistoryTrigger on education_training__c (after update) {
    List<education_training__c> edu = Trigger.New;
    
    If( edu[0].Status__c == '受講済' || edu[0].Status__c == '支払済' ) {
        setTrainingHistory.setTrainingHistory(edu);
        
    }
}
クラス
public class setTrainingHistory {
    public static void setTrainingHistory(education_training__c[] edu){
        // トリガの教育訓練と同じスタッフの「支払済」または「受講済」履歴をリストで取得
        List<education_training__c> etr = [SELECT Id,result_print__c, staff__c From education_training__c 
                                           WHERE staff__c =: Trigger.New[0].Id AND (Status__c = '支払済' OR Status__c = '受講済') 
                                           ORDER BY enddate__c ];
        // 履歴をつなげる変数を初期化
        String txt = '';
        
        // 上記のスタッフを取得
        List<Contact> con = [SELECT Id, Name, TrainingHistoryforStaffwin__c FROM Contact WHERE Id =: etr[0].staff__c LIMIT 1];

        // 履歴をテキストで結合する
        For( integer i = 0 ; i < etr.size() ; i++ ){
            txt += etr[i].result_print__c;
        }
        
        con[0].TrainingHistoryforStaffwin__c = txt;
        update con[0];
        
    }

}


 
Best Answer chosen by iwaki
Taiki YoshikawaTaiki Yoshikawa
ちょっときになったところ、1件のレコードのみ対象とした処理になっていると思います。

この方法だとリスト変数でまとめてINSERTしたり、データローダで一括登録したときに正常に処理されなくなってしまうので、トリガ開発では複数レコード処理を意識して実装するといいと思います。

よろしければこちらもどうぞ
https://www.youtube.com/watch?v=Vs7rtPSJr_E&index=2&list=PLFSi-6JPTf9glvEZhBJNYouZPXfd4PVIi
 

All Answers

Taiki YoshikawaTaiki Yoshikawa
List index out of bounds: 0: というエラーですが、リスト変数を参照した際に一件も無かった場合に発生します。
今回のケースの場合は変数『etr』の値が取得できていないことが原因のように見えます。
iwakiiwaki
ありがとうございます。
確認したところ、やりたいこととコードの記述に誤りのある単純なミスでした。解決できました、すいません。
Taiki YoshikawaTaiki Yoshikawa
ちょっときになったところ、1件のレコードのみ対象とした処理になっていると思います。

この方法だとリスト変数でまとめてINSERTしたり、データローダで一括登録したときに正常に処理されなくなってしまうので、トリガ開発では複数レコード処理を意識して実装するといいと思います。

よろしければこちらもどうぞ
https://www.youtube.com/watch?v=Vs7rtPSJr_E&index=2&list=PLFSi-6JPTf9glvEZhBJNYouZPXfd4PVIi
 
This was selected as the best answer
iwakiiwaki
返信が遅くなり申し訳ございません。
ご指摘ありがとうございました!その通りでデータローダで一括更新をかける予定です。
リンクも参考にしてコードの改善を図ってみますが、行き詰まったときはまた質問させていただきます。