New Batch#100 (10th Nov 2021) - Salesforce Admin + Dev Training (WhatsApp: +91 - 8087988044) :https://t.co/p4F3oeQagK

Saturday, 14 July 2012

Batchable Apex and Schedulable Apex

* It is a powerful new feature to do batch processing on our database records.
* It was released in summer'09.
* It is used to execute large volumes of data unlike ordinary DML and SOQL  statements.
* Tasks that require processing of large data volumes without any active human intervention can take advantage of this feature.
*  As an example, consider the task of validating addresses in your contacts when you can potentially have millions of contact records.  A batch job would be ideal for this scenario since you can start the batch job, continue to work or even log off while the job continues to execute.
* Batch-apex can execute large volumes of data up to 50 million records.
*To remove custom object records in bulk we need to delete it through data loader, now we can do it with Batch-apex.
*For Mass updating, inserting and other similar scenarios like this can be more conveniently handled with force.com's Batch Apex.
* With Batch Apex, we can now build complex, long-running processes on the platform. This feature is very useful for time to time data cleansing, archiving or data quality improvement operations.
* To use this functionality, you need to implement the Database.Batchable interface.
* 'Database' is a class and 'Batchable' is the interface inside the class.
* This interface demands for three methods to be implemented:
   1. Start()
   2. execute()
   3. finish()
***********
1. Start() Method:
* Start() method is called at the beginning of a batch Apex job. 
* Use this method to collect the records (of objects) to be passed to the "execute" method for processing. 
* The start() method determines the set of records that will be processed by the executeBatch method. We would need to construct a SOQL query and return a QueryLocator object.
return Database.getQueryLocator( 'SELECT Name, MailingAddress FROM Contact');
*QueryLocator can retrieve up to 50 million records at a time. 
*Instead of QueryLocator, we can use 'Iterable' which can process up to 50 thousand records.
* The Apex engine automatically breaks the massive numbers of records we selected into smaller batches and repeatedly calls the "execute" method until all records are processed.
* Start() and finish() methods executes only one time. 
* But execute() method execute many times based on number of batches.


2. execute() Method:
*  It will fetch the records from the start method.
* We can perform all the DML operations here on bulk volumes of data.

3. finish() Method:
* All the post processing operations like sending emails will be done here. 
 *************
Database.BatchableContext:
* It is the interface which holds the run-time information.
**************
Program to give 20% discount on all the books

//To provide 20% discount for all the books
/*BatchApexProcessing b = new BatchApexProcessing();
  Id jobid = Database.executeBatch(b,3);*/
  //Note: If there are any triggers for the object which we are using for the batchApexProcessing, it won't work
//For the below class we are using list, so it can accept upto 50000 records
//Database is the class name and Batchable is the interface name which is inside database class
//To access interface Database.Batchable we have to use
/*
global class BatchApexProcessing implements Database.Batchable<Book__c> {
    global Iterable<Book__c> start(Database.BatchableContext bc){
        List <Book__c> bl = new List <Book__c>();
        bl = [select Id,Name,Author__c,Price__c from Book__c];
        return bl;
    }
    global void execute(Database.BatchableContext bc, LIST<Book__c> bl) {
        for(Book__c b:bl) {
            b.Price__c *= 0.80;
        }      
        update bl;
    }
    global void finish(Database.BatchableContext bc) {
    }
}
*/

//    ********    Using Query Locater    ****************

//For the below class we are using Query Locater, so it can accept upto 50 million records
global class BatchApexProcessing implements Database.Batchable<sObject>,Database.stateful { 
    //database.stateful is used to make data members with new values assigned should reflect
    String myname = 'SRINU';   
    global Database.QueryLocator <Book__c> start(Database.BatchableContext bc) {
        myname = 'SRINIVAS';
        System.Debug('***** My Name in Start *****'+myname);
        List <Book__c> bl = new List <Book__c>();
        String Query = 'select Id,Name,Author__c,Price__c from Book__C';
        return Database.getQueryLocator(Query);
    }
    global void execute(Database.BatchableContext bc, LIST<book__c> bl){
        for(Book__c b:bl) {
            System.Debug('***** My Name in Start *****'+myname);
            b.Price__c *= 0.75;
        }
        update bl;
    }
    global void finish(Database.BatchableContext bc) {
        System.Debug('***** My Name in Start *****'+myname);
    }   
}

 
 ****************************************
http://salesforcesource.blogspot.in/2010/02/utilizing-power-of-batch-apex-and-async.html
http://blogs.developerforce.com/systems-integrator/2009/05/batch-apex-a-powerful-new-functionality-in-summer-09.html
http://blog.ic-2000.com/2011/09/executing-batch-apex-in-sequence/

3 comments:

Labels