この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

Newer Version Available

This content describes an older version of this product. View Latest

一般的な一括トリガイディオム

一括トリガを使用すると、開発者は実行ガバナ制限を超えることなくより多くのレコードを処理することができますが、一度に複数のレコードの一括処理を呼び出すため、理解しにくい場合やコード化が難しくなる場合があります。次のセクションでは、一括処理を記述する場合に頻繁に使用されるイディオムの例について説明します。

一括トリガでの対応付けおよびセットの使用

セットおよび対応付けのデータ構造は、一括トリガを適切にコード化する上で重要です。セットを使用して各レコードを分割し、対応付けを使用してクエリ結果をレコード ID で編成して保持することができます。

たとえば、サンプルの見積アプリケーションの一括トリガは、最初に Trigger.new の OpportunityLineItem レコードに関連付けられた各価格表エントリをセットに追加し、セットに異なる要素のみが含まれるようにします。次に、関連付けられた製品の色の PricebookEntries を照会して、結果を対応付けに配置します。対応付けが作成されると、トリガは Trigger.new の OpportunityLineItems により繰り返し実行され、対応付けを使用して適切な色を割り当てます。

1// When a new line item is added to an opportunity, this trigger copies the value of the
2// associated product's color to the new record.
3trigger oppLineTrigger on OpportunityLineItem (before insert) {
4
5    // For every OpportunityLineItem record, add its associated pricebook entry
6    // to a set so there are no duplicates.
7    Set<Id> pbeIds = new Set<Id>();
8    for (OpportunityLineItem oli : Trigger.new) 
9        pbeIds.add(oli.pricebookentryid);
10
11    // Query the PricebookEntries for their associated product color and place the results
12    // in a map.
13    Map<Id, PricebookEntry> entries = new Map<Id, PricebookEntry>(
14        [select product2.color__c from pricebookentry 
15         where id in :pbeIds]);
16         
17    // Now use the map to set the appropriate color on every OpportunityLineItem processed
18    // by the trigger.
19    for (OpportunityLineItem oli : Trigger.new) 
20        oli.color__c = entries.get(oli.pricebookEntryId).product2.color__c;  
21}

一括トリガのレコードとクエリ結果の関連付け

Trigger.newMap および Trigger.oldMap の ID-to-sObject 対応付けを使用して、レコードをクエリ結果に関連付けます。たとえば、サンプル見積アプリケーションのこのトリガでは、Trigger.oldMap を使用して、一意の ID のセットを作成します (Trigger.oldMap.keySet())。セットはクエリの一部として使用され、トリガで処理される商談に関連付けられる見積のリストを作成します。クエリによって返される各見積の場合、関連付けられた商談が Trigger.oldMap から取得され、削除されないようにします。

1trigger oppTrigger on Opportunity (before delete) {
2    for (Quote__c q : [SELECT opportunity__c FROM quote__c 
3                       WHERE opportunity__c IN :Trigger.oldMap.keySet()]) {
4        Trigger.oldMap.get(q.opportunity__c).addError('Cannot delete 
5                                                       opportunity with a quote');
6    }
7}

トリガを使用した、一意の項目を持つレコードの挿入または更新

insert イベントまたは upsert イベントによってレコードがバッチ内の別の新しいレコードで一意の項目の値を複製する場合、重複したレコードについてのエラーメッセージには、最初のレコードの ID が記載されます。ただし、要求が完了するまではエラーメッセージが適切でない場合があります。

トリガが存在する場合、一括操作の再試行ロジックにより、ロールバック/再試行サイクルが発生します。その再試行サイクルは新しいキーを新しいレコードに割り当てます。たとえば、2 つのレコードに一意の項目の同じ値が挿入され、insert イベントがトリガに定義されている場合、2 番目の重複レコードが失敗し、最初のレコードの ID が報告されます。ただし、変更がロールバックされ、最初のレコードが再挿入されると、レコードは新しい ID を受け取ります。つまり、2 番目のレコードによって報告されたエラーメッセージは有効ではなくなります。