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;  
}

 

IT

Posted by arkgame