You need to sign in to do that
Don't have an account?
iwaki
参照先オブジェクトを更新する場合の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」
トリガとクラスは以下のように記載しています。
知識がないのがお恥ずかしい限りですが、解決方法をご教示くだされば幸いです。よろしくお願いいたします。
トリガ
取引先責任者を参照するカスタムオブジェクト(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]; } }
この方法だとリスト変数でまとめてINSERTしたり、データローダで一括登録したときに正常に処理されなくなってしまうので、トリガ開発では複数レコード処理を意識して実装するといいと思います。
よろしければこちらもどうぞ
https://www.youtube.com/watch?v=Vs7rtPSJr_E&index=2&list=PLFSi-6JPTf9glvEZhBJNYouZPXfd4PVIi
All Answers
今回のケースの場合は変数『etr』の値が取得できていないことが原因のように見えます。
確認したところ、やりたいこととコードの記述に誤りのある単純なミスでした。解決できました、すいません。
この方法だとリスト変数でまとめてINSERTしたり、データローダで一括登録したときに正常に処理されなくなってしまうので、トリガ開発では複数レコード処理を意識して実装するといいと思います。
よろしければこちらもどうぞ
https://www.youtube.com/watch?v=Vs7rtPSJr_E&index=2&list=PLFSi-6JPTf9glvEZhBJNYouZPXfd4PVIi
ご指摘ありがとうございました!その通りでデータローダで一括更新をかける予定です。
リンクも参考にしてコードの改善を図ってみますが、行き詰まったときはまた質問させていただきます。