You need to sign in to do that
Don't have an account?
iwaki
Apexガバナ制限に抵触したトリガの修正方法
以下のようなトリガーを作成しています。
データローダで100件ほどinsertしたところ、「System.LimitException: Too many SOQL queries: 101」となってしまいました。
修正内容をご教示いただけないでしょうか。
何卒宜しくお願い申し上げます。
データローダで100件ほどinsertしたところ、「System.LimitException: Too many SOQL queries: 101」となってしまいました。
trigger setTrainingHistory on education_training__c (after insert,after update) { List<Contact> ths = new List<Contact>(); List<Contact> con = [SELECT TrainingHistoryforStaffwin__c FROM Contact WHERE Id IN (SELECT staff__c FROM education_training__c WHERE Id =: Trigger.New)]; for( Contact c : con){ c.TrainingHistoryforStaffwin__c = ''; for( education_training__c e : [SELECT Id, result_print__c FROM education_training__c WHERE staff__c =: c.Id AND (Status__c ='支払済' OR Status__c = '受講済') ORDER BY ProgramSort__c]){ c.TrainingHistoryforStaffwin__c += e.result_print__c; } ths.add(c); } update ths; }具体的にどの部分を修正したらよいものかわからず、現在はinsertするcsvを分割して行っている状態です。
修正内容をご教示いただけないでしょうか。
何卒宜しくお願い申し上げます。
最初に取得した取引先責任者IDを条件にループの外でエデュケーショントレーニングの情報を取得します。
取引先責任者IDを条件にマップにセットしておけばループ内でクエリを実行しなくても対象レコードを取得できると思います。
ざっくりですが、こんな感じだと思います。
※実装イメージなので実際にはもう少しキレイに直して下さい。
All Answers
最初に取得した取引先責任者IDを条件にループの外でエデュケーショントレーニングの情報を取得します。
取引先責任者IDを条件にマップにセットしておけばループ内でクエリを実行しなくても対象レコードを取得できると思います。
ざっくりですが、こんな感じだと思います。
※実装イメージなので実際にはもう少しキレイに直して下さい。
取引先責任者とエデュケーショントレーニングのオブジェクトは参照関係なのでいただいた内容を基に修正をさせていただきます。