Saturday, 28 July 2012

Rollup summary Using trigger(counting opportunity on account)

//To do rollup on Account with opportunity and display the sum of No of hours on related account
trigger OpportunityRollup on Opportunity (after delete, after insert, after update) {
        Set<Id> accountids=new Set<Id>();
        Map<id,Account> mapaccount=new Map<id,Account>();
        Map<id,List<opportunity>> mapopportunity=new Map<id,List<opportunity>>();
      if(Trigger.isInsert || Trigger.isUpdate){
                List<Opportunity> lstopp=[select id,name,No_of_Hours__c,accountid from opportunity where id in:Trigger.newMap.keyset()];
                for(Opportunity opp:lstopp){
                     accountids.add(opp.accountid);
                }
                List<Account>  acclst=[select id,name,No_of_opp__c,No_of_Hours__c,industry,(select accountid,id,No_of_Hours__c,name from opportunities) from account where id in:accountids];
                for(Account acc:acclst){
                    mapaccount.put(acc.id,acc);
                    mapopportunity.put(acc.id,acc.opportunities);
                 }
                AggregateResult i=[select sum(No_of_Hours__c) from opportunity where accountid in:mapaccount.keyset()];
                for(Id id:mapaccount.keyset()){
                        mapaccount.get(id).No_of_opp__c=0;
                        mapaccount.get(id).No_of_Hours__c=0;
                        mapaccount.get(id).No_of_opp__c=mapopportunity.get(id).size();
                        decimal total=0;
                        for(Opportunity opp:mapopportunity.get(id)) {
                            if(opp.No_of_Hours__c!=null)
                                //total+=opp.No_of_Hours__c;
                                mapaccount.get(id).No_of_Hours__c=mapaccount.get(id).No_of_Hours__c+opp.No_of_Hours__c;
                        }  
                        //mapaccount.get(id).No_of_Hours__c=total;
                }
               
                if(mapaccount!=null && mapaccount.size()>0){
                  try{
                        update mapaccount.values();
                  }
                  catch(Exception e){
                   
                  }
                }
      }
      if(Trigger.isDelete){
            List<Opportunity> lstopp=[select id,name,No_of_Hours__c,accountid from opportunity where id in:Trigger.oldMap.keyset()];
                for(Opportunity opp:lstopp){
                     accountids.add(opp.accountid);
                }
                List<Account>  acclst=[select id,name,No_of_opp__c,No_of_Hours__c,industry,(select accountid,id,No_of_Hours__c,name from opportunities) from account where id not in:accountids];
                for(Account acc:acclst){
                    mapaccount.put(acc.id,acc);
                    mapopportunity.put(acc.id,acc.opportunities);
                 }
                AggregateResult i=[select sum(No_of_Hours__c) from opportunity where accountid in:mapaccount.keyset()];
                for(Id id:mapaccount.keyset()){
                        mapaccount.get(id).No_of_opp__c=0;
                        mapaccount.get(id).No_of_Hours__c=0;
                        mapaccount.get(id).No_of_opp__c=mapopportunity.get(id).size();
                        decimal total=0;
                        for(Opportunity opp:mapopportunity.get(id)) {
                            if(opp.No_of_Hours__c!=null)
                                //total+=opp.No_of_Hours__c;
                                mapaccount.get(id).No_of_Hours__c=mapaccount.get(id).No_of_Hours__c+opp.No_of_Hours__c;
                        }  
                        //mapaccount.get(id).No_of_Hours__c=total;
                }
               
                if(mapaccount!=null && mapaccount.size()>0){
                  try{
                        update mapaccount.values();
                  }
                  catch(Exception e){
                   
                  }
                }
      }
       
}

No comments:

Post a Comment