Ever had the requirement to delete objects with a Batch job ? This is very common when you have external interfaces in your org. Usually you need to delete multiple objects, so do you setup multiple batch jobs ?
How about doing this with just one batch job ?
See below code and let me know if you have questions…
global class ManosTestBatchMultiple implements Database.batchable{
global Iterable start(Database.batchableContext info){
return new ManosTest();
}
global void execute(Database.batchableContext info, List scope){
List lToDelete=new List();
for(SObject s : scope){
lToDelete.add(s);
}
delete lToDelete;
}
global void finish(Database.batchableContext info){}
global class ManosTest implements Iterable {
global Iterator Iterator(){
return new ManosTestIterable();
}
}
}
but the interesting part is in the following piece of code.
WARNING: This is NOT an OPTIMAL coding solution, its just give you an idea how to do it
global class ManosTestIterable implements Iterator{
List<List> lToDelete {get; set;}
Integer i {get; set;}
Integer size {get; set;}
Integer size1 {get; set;}
public ManosTestIterable(){
List lToDelete1 = [SELECT Id
FROM TestManos__c
WHERE Deletion_Flag__c = true];
List lToDelete2 = [SELECT Id
FROM TestManos2__c
WHERE Deletion_Flag__c=true];
size = 0 ;
lToDelete = new List<List>();
lToDelete.add(lToDelete1);
size += lToDelete1.size();
size1 = lToDelete1.size();
lToDelete.add(lToDelete2);
if (lToDelete2 != null)
size += lToDelete2.size();
i = 0;
}
global boolean hasNext(){
if (i >= (size-1)){
return false;
} else {
return true;
}
}
global SObject next()
{
if(i == (size-1))
{
return null;
}
i++;
if (i <=size1)
{
return lToDelete[0][i-1];
}
else
{
return lToDelete[1][i-size1-1];
}
}
}
Like this:
Like Loading...