• michelle.avery
  • NEWBIE
  • 0 Points
  • Member since 2013

  • Chatter
    Feed
  • 0
    Best Answers
  • 0
    Likes Received
  • 0
    Likes Given
  • 0
    Questions
  • 1
    Replies

I have an account hierarchy in my project. I have to count cumulative child for all account and store into Child_count__c in Account. I wrote the following Batch apex, but not getting success. Please let me know any right approach.
Batch Apex code as follows:

global class AccountChild_count implements Database.Batchable<sObject>{
     global Database.QueryLocator start(Database.BatchableContext BC){      
          return Database.getQueryLocator('Select Id, ParentId, Parent.ParentId, Parent.Parent.ParentId,Parent.Parent.Parent.ParentId, Parent.Parent.Parent.Parent.ParentId,Parent.Parent.Parent.Parent.Parent.ParentId from account where ACCT_STATUS__c=\'ACTIVE\' AND COUNTRY_FORM__c=\'USA\' LIMIT 5');   
          }   
          global void execute(Database.BatchableContext BC, List<sObject> scope){     
          try{    
              Map<ID, String> map_str1 =  new Map<Id, String>();    
              Map<ID, Account> map_str2 =  new Map<Id, Account>();    
              String str_of_Ids;    
              for(Integer i=0;i<scope.size();i++){           
                  Account acc=(Account)scope.get(i);           
                    str_of_Ids=String.ValueOf(acc.ParentId)+','+acc.Parent.ParentId+','+acc.Parent.Parent.ParentId+','+acc.Parent.Parent.Parent.ParentId+','+acc.Parent.Parent.Parent.Parent.ParentId+','+acc.Parent.Parent.Parent.Parent.Parent.ParentId;           
                    map_str1.put(acc.id, str_of_Ids);           
                    map_str2.put(acc.id, acc);    
                    }         
                    List <Account> accList=map_str2.values();        
                    for(Account acc1 :accList){          
                        acc1.Parent_ID_List__c=map_str1.get(acc1.id);                
                        }     
                        update accList;  
                         
                    for(Account acc2:accList){
                        Integer intNumberOfContacts = [SELECT count()FROM Account WHERE Parent_ID_List__c Like : acc2.ID];          
                        acc2.Child_Count__c=intNumberOfContacts;      
                    }    
                    update accList;
                       
                    }catch(Exception ex){    }      
                    }   
                    global void finish(Database.BatchableContext BC){   
                    }  
  }