Saturday 13 December 2014

Rollup Summary for Lookup Field


Few days back requirement came across where there was a need to create a rollup summary field for objects which do not have Master-Detail relationship but lookup relationship, and we all know rollup summary field is only available for Master Detail so we left with no other option but to write Apex Code.

We have two objects LookupMaster__c and LookupChild__c having lookup relation.

  
We will write trigger on LookupChild__c for event after insert, after update, after delete.

trigger customRollup on LookupChild__c(after delete, after insert, after update){
    
    set<Id> masterIdSet = new set<Id>();
    
    if(trigger.isInsert) {
        for(LookupChild__c lookupRec : trigger.new) {
            masterIdSet.add(lookupRec.LookupMaster__c);
        }    
    } else if(trigger.isUpdate) {
        for(lookupChild__c lookupRec : trigger.new) {
            masterIdSet.add(lookupRec.LookupMaster__c);
        }
    } else if(trigger.isDelete){
        for(lookupChild__c lookupRec : trigger.old) {
            masterIdSet.add(lookupRec.LookupMaster__c);
        }
    } 
    
    if(masterIdSet.size() > 0) {
        customRollup rollUp = new customRollup ();
        rollUp.rollupAmount(masterIdSet);
    }
}

and will write an Controller to write logic for insert, delete and update.

public Class customRollup {
    
    public void rollupAmount(set<Id> masterIdSet) {
        Integer AmountVal = 0;
        
        list<LookupChild__c > childList = new list<LookupChild__c >();
        childList = [Select Id, Name, Amount__c, LookupMaster__c From LookupChild__c Where LookupMaster__c IN: masterIdSet];
        
        map<Id, Integer> masterChildMap = new map<Id, Integer>();
        
        for(LookupChild__c child : childList) {
            if(masterChildMap.containsKey(child.LookupMaster__c)) {
                AmountVal = masterChildMap.get(child.LookupMaster__c) + (Integer)child.Amount__c;
                masterChildMap.put(child.LookupMaster__c, AmountVal);
            } else {
                masterChildMap.put(child.LookupMaster__c, (Integer)child.Amount__c);
            }
        }
        
        list<LookupMaster__c> masterList = new list<lookupMaster__c>();
        LookupMaster__c m;
        for(Id master : masterChildMap.keySet()) {
            m = new LookupMaster__c();
            m.Id = master;
            m.Total_Amount__c = masterChildMap.get(master);
            masterList.add(m);
        }
        update masterList;
    }
}

after saving above code the Total_Amount__c field on LookupMaster__c object will get updated value every time its child record get inserted, updated or deleted. You can also implement the logic for undelete as well in above code.


No comments:

Post a Comment