Salesforce トリガー一括DMLの実行サンプル

環境
Salesforce

使用例1
update ステートメントが商談ごとに 1 回ずつコールされるため、非効率的です。
取引先の一括更新操作でトリガーを実行する場合、
取引先が数多く存在する可能性があります。各取引先に 1 ~ 2 件の商談があれば、
商談数がたちまち 150 を超えてしまいます。
DML ステートメントの制限は 150 コールです。
サンプルコード

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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;
}
}
}
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; } } }
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 コールを実行します。
サンプルコード

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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;
}
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; }
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