Salesforce トリガー一括DMLの実行サンプル
環境
Salesforce
使用例1
update ステートメントが商談ごとに 1 回ずつコールされるため、非効率的です。
取引先の一括更新操作でトリガーを実行する場合、
取引先が数多く存在する可能性があります。各取引先に 1 ~ 2 件の商談があれば、
商談数がたちまち 150 を超えてしまいます。
DML ステートメントの制限は 150 コールです。
サンプルコード
trigger DmlTriggerNotBulk on Account(after update) { //関連商談を取得 List<Opportunity>relatedOpps = [SELECT Id,Name,Probaility FROM Opportunity WHERE AccountId IN :Trigger.new]; //商談をループで処理 for(Opportunity opp : relatedOpps){ //確率は50%~100% if((opp.Probaility >=50) && (opp.Probaility <100)) { opp.Description = '商談の説明'; // 商談1回目更新 効率ではない update opp; } } }
使用例2
次の例 (DmlTriggerBulk) は、商談のリストに対する 1 回の
DML コールで DML を一括して実行する効率的な方法を示しています。
この例では、更新する Opportunity sObject をループの商談リスト]
(oppsToUpdate) に追加します。すべての商談がリストに追加された後、
トリガーがループ外でこのリストに DML コールを実行します。
サンプルコード
trigger DmlTriggerNotBulk on Account(after update) { //関連商談を取得 List<Opportunity>relatedOpps = [SELECT Id,Name,Probaility FROM Opportunity WHERE AccountId IN :Trigger.new]; List<Opportunity>oppsToUpdate = new List<Opportunity>(); //商談をループで処理 for(Opportunity opp : relatedOpps){ //確率は50%~100% if((opp.Probaility >=50) && (opp.Probaility <100)) { opp.Description = '商談の説明'; oppsToUpdate.add(opp); } } // コレクションに対して DML を実行する update oppsToUpdate; }