2017-07-29 8 views
1

私はApexとトリガーを初めて使っているので、私にご負担ください。Apexトリガー - ジャンクションオブジェクト

私はカスタムオブジェクトConferencesを持っています。このカスタムオブジェクトは、カスタムJunctionオブジェクトJunctionのマスターです。そのジャンクションオブジェクトは、標準オブジェクトの連絡先の関連リストを表示できるように設定されており、コンタクトを会議に関連付けることができます。

私は、Junctionオブジェクトを通じて会議に割り当てられた連絡先の挿入、更新後、削除後、削除の後に発生するApexトリガーを作成しようとしています。すべてのトリガーが行う必要があるのは、会議に関連付けられた連絡先の数のカウントを示す会議オブジェクトのフィールドを更新することです。

私はこれを必要以上に困難にしなければならないように感じます。私はこのタスクのためのデータモデリングに苦労しています - 私は私のトリガーが接点オブジェクトの上になければならないので、私のトリガーは接点の数になるはずですので、私のコードが始まると仮定します:

(挿入後、更新後の 、元に戻す 後に削除した後 、 )Junction__c上のトリガConferenceAttendeesUpdater {私はそれが連結オブジェクトはトリガーが起動します更新され、いつでもを読み込み思っていることから、ずさんなコードのように思える

、本当に必要なときは、連絡先の数が変わったときだけです。何らかの理由で、私が必要とする方法を概念的に把握するのに問題があります。私はJunction__c.Contacts.size()会議に割り当てられた連絡先の数を含むだろうと思っている?

ご協力いただければ幸いです。

答えて

0

はい、連絡先に関連するJunction__cレコードの数をカウントする場合は、Junction__cオブジェクトにトリガーを設定します。ベストプラクティスは、トリガーのクラスではないロジックにロジックを配置することです。以下は、あなたが望むものの大まかな実装です。

trigger ConferenceAttendeesUpdater on Junction__c (after insert, after update, after delete, after undelete) { 
    if (Trigger.isAfter && Trigger.isInsert){ 
    junctionHelper.afterInsert(Trigger.new); 
    } 
    if (Trigger.isAfter && Trigger.isUpdate){ 
    junctionHelper.afterUpdate(Trigger.new, Trigger.old); 
    } 
    if (Trigger.isAfter && Trigger.isDelete){ 
    junctionHelper.afterInsert(Trigger.old); 
    } 
    if (Trigger.isAfter && Trigger.isUndelete){ 
    junctionHelper.afterInsert(Trigger.new); 
    } 
} 

public without sharing junctionHelper(){ 
    public static void afterInsert(List<Junction__c> newList){ 
    Map<Id,Contact> contactRollup = new Map<Id,Contact>(); 
    for (Integer i=0;i<newList[i].size();i++){ 
     if (newList[i].Contact__c != null){ 
     contactMap.put(newList[i].Contact__c, new Contact(Id=newList[i].Contact__c,Number_of_Junctions__c=0)); 
     } 
    } 
    } 
    public static void afterUpdate(List<Junction__c> newList, List<Junction__c> oldList){ 
    Map<Id,Contact> contactRollup = new Map<Id,Contact>(); 
    for (Integer i=0;i<newList[i].size();i++){ 
     if (newList[i].Contact__c != oldList[i].Contact__c){ 
     contactMap.put(newList[i].Contact__c, new Contact(Id=newList[i].Contact__c,Number_of_Junctions__c=0)); 
     } 
    } 
    } 
    public static void rollUpContacts(Map<Id,Contact> contactMap){ 
    for (AggregateResult ar : [ 
     SELECT COUNT(Id) cnt, Contact__c parentId 
     FROM Junction__c 
     WHERE Contact__c IN :contactMap.keySet() 
    ]{ 
     Id parentId = (String)ar.get('parentId); 
     Decimal cnt = (Decimal)ar.get('cnt'); 
     contactMap.put(parentId,new Contact(Id=parentId,Number_of_Junctions__c=cnt)); 
    } 
    update contactMap.values(); 
    } 
} 
関連する問題