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);
}
-
Can someone tell me, where am i going wrong? – pluto Aug 25 '14 at 8:09
-
What do you want to do ? What's the errors displayed ? Please provide more informations ! – SF_user Aug 25 '14 at 8: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 8:28
Add a comment
|
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 ofi
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 initializedglobal integer i = 0;
-
1Still have to implement Schedulable in BatchClassExample to use "Scheduled Apex" won't they? – Phil Hawthorn Aug 25 '14 at 9:30
-
-
@ 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 6:58