0
global class BatchClassExample implements Database.Batchable<sObject>  
 {     
  global integer i;  
  global list<sObject> start(Database.BatchableContext BC)  
   {  
     list<Opportunity> oList=new list<Opportunity>([select id from opportunity where StageName='Closed Won']);  
    return oList;  
   }  
  global void execute(Database.BatchableContext BC, list<opportunity> oList)  
   {      
    Set<Id> opSet = new Set<Id>();       
    for(opportunity op:oList)    
     {  
        opSet.add(op.id);  
     }      
    AggregateResult[] results=[select count(id) from opportunity where id in:opSet];  
    for(AggregateResult ar:results)  
     {  
      i=Integer.ValueOf(ar.get('expr0'));  
     }  
      Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();  
      String[] toAddresses = new String[] {'richa.a.shrivastava@accenture.com'};     
      mail.setToAddresses(toAddresses);  
      mail.setSubject('Count Of Opportunities closing today ');  
      mail.setPlainTextBody('Closed opportunities for today are: ' +i);  
      Messaging.sendEmail(new Messaging.SingleEmailMessage[] {mail} );  
   }   
  global void finish(Database.BatchableContext BC)  
   {   
   }  
 }  




global class ScheduleBatchClass implements schedulable  
{  
 ScheduleBatchClass sBC =new ScheduleBatchClass();  
 global void execute(SchedulableContext sc)  
  {  
   BatchClassExample  bCE= new BatchClassExample ();  
   Integer scopeSize = 200;  
   Database.executeBatch(bCE,scopeSize);    
  }  
  Datetime sysTime = System.now().addSeconds(60);        
  String sch= '' + sysTime.second() + ' ' + sysTime.minute() + ' ' + sysTime.hour() + ' ' + sysTime.day() + ' ' + sysTime.month() + ' ? ' + sysTime.year();  
  String jobID = system.schedule('Batch Scheduled Job', sch, sBC);  
}  
Christian Deckert
  • 5,219
  • 4
  • 33
  • 68
pluto
  • 143
  • 1
  • 2
  • 9
  • Can someone tell me, where am i going wrong? – pluto Aug 25 '14 at 08:09
  • What do you want to do ? What's the errors displayed ? Please provide more informations ! – SF_user Aug 25 '14 at 08:23
  • i have to send an email daily, giving count of closed opportunities using batch scheduling. And the code has been compiled successfully, but i am not getting any email!! – pluto Aug 25 '14 at 08:28

1 Answers1

3

I don't see anything wrong with the email sending code. But it looks like you are not calling Database.executeBatch anywhere so the batch will never run. Personally, I would just use the "Schedule Apex" button to schedule this ScheduleBatchClass:

global class ScheduleBatchClass implements Schedulable {
    global void execute(SchedulableContext sc) {
        Integer scopeSize = 5000;
        Database.executeBatch(new BatchClassExample(), scopeSize);  
    } 
} 

There are also these two problems in the counting logic:

  • the class needs to implement a second marker interface implements Database.Batchable<sObject>, Database.Stateful { so that the value of i is preserved across batches
  • as the work is likely to be broken up into many batches, the total needs to be incremented not assigned i += Integer.ValueOf(ar.get('expr0')); and so the value needs to be initialized global integer i = 0;
Keith C
  • 135,775
  • 26
  • 201
  • 437
  • 1
    Still have to implement Schedulable in BatchClassExample to use "Scheduled Apex" won't they? – Phil Hawthorn Aug 25 '14 at 09:30
  • You are right - thank I'll update the answer. – Keith C Aug 25 '14 at 09:48
  • @ Keith C oops,sorry i forgot to add Database.executeBatch method. But now i have modified the code. Still it is not sending any mail. – pluto Aug 25 '14 at 10:23
  • @pluto Do address the other points too. But at this point you'll have to start doing some debugging unless anyone else can see the problem - here is sone info on how to do that. – Keith C Aug 25 '14 at 10:42
  • I have uploaded the modified code. I am receiving the mail regarding closed opportunities when i run the code in execute anonymous. But somehow it is not getting scheduled. Could someone help? – pluto Aug 26 '14 at 06:58