SlideShare a Scribd company logo
8/31/2012




     Using Batch Jobs to Improve
         the User Experience




              Safe Harbor
I've always said to anyone that will listen to me
(which is not very many) that software is an art
form. It attracts artists.
Just look at any software company and the
amount of musicians, artists, carpenters, etc…
working there that create code for a living and
create other things in their down time.
 - Steve Lacey




                                                           1
8/31/2012




 A developer can now employ batch Apex to
 build complex, long-running processes on the
 Force.com platform.




              - Force.com Apex Code Developers Guide




Complex, Long Running tasks

• Pre or Post processing tasks
• Account reassignments
• Price book updates
• Custom or Transactional Objects

Governor Limits are Your Friends …




                                                              2
8/31/2012




            Scenario 1

• 324,476 Accounts

• 142,105 Opportunity records

• 1 NEW record type




       Administrative Use

• Nulling out a field

• Arghhhh!!!!!




                                       3
8/31/2012




      Developer Objects

• Batch Process(es)
• Something to fire it
  – Trigger
  – Schedule
  – VisualForce Page
• Test Class




         Batch Process

• Start – Define the records to
  process
• Execute – “Long, Complex…”
• Finish – Post processing
  – e-Mail status
  – Schedule a repeat job, etc




                                         4
8/31/2012




                                 APEX Code
global class BatchOppLineZero implements Database.Batchable<SObject> {

    global final string query;
    global boolean process_on;

    List<OpportunityLineItemSchedule> schList = new List<OpportunityLineItemSchedule> ();

    private string query1 = 'Select Id, scheduledate, revenue from OpportunityLineItemSchedule';

    global BatchOppLineZero () {

        if (system.Test.isRunningTest()) {
           this.query = query1 + ' where scheduledate >= :chkDate';
        } else {
           this.query = query1 + ' where scheduledate >= :testDate';
        }
    }
*
*




                                 APEX Code
        Start Method

        global Database.queryLocator start(Database.BatchableContext ctx){
           Date myDate = date.today();
           Date chkDate = date.newinstance (mydate.year(),mydate.month(),1).addmonths(-3);
            return Database.getQueryLocator(query);
         }




                                                                                                          5
8/31/2012




                           APEX Code
Execute Method
global void execute(Database.BatchableContext ctx, List<Sobject> scope){
    schList = (List<OpportunityLineItemSchedule>)scope;

       for (OpportunityLineItemSchedule lis:schList) lis.revenue=0;
       update schList;

   }




                             Scenario 1
  n opportunity records need to be updated
  • Record type needs to be changed
  • OwnerId updated
          – Should be the account owner
          – Default for account location if owner is
            inactive
  • Opportunity type should reflect account
    property




                                                                                  6
8/31/2012




                    Execute Method – scenario 1
global void execute(Database.BatchableContext ctx, List<Sobject> scope){
    oppUpdate = (List<Opportunity>)scope;

       List<Account> accList = new List<Account>();
       Set<Id> accId = new set<id>();

       ID recTypeId;
       List<RecordType> recList = new List<RecordType> ([Select Id, Name from RecordType]);
       for (RecordType rec:recList) if (rec.name=='Ad Revenue') recTypeId=rec.id;

       ID pitOwnerID, denOwnerID, laxOwnerID;
       List<User> repList = [Select ID, name, Property__c, IsActive, Sales_id__c from User];
       MAP<string,User> repMap = new MAP<string,User>();
       MAP<Id,User> repActiveMap = new MAP<Id,User>();

       for (User u:repList) {
          repMap.put(u.UserNumber__c,u);
          repActiveMap.put(u.id,u);
          if (u.name == ‘PIT Owner') pitOwnerID=u.id;
          if (u.name == ‘DEN Owner') denOwnerID=u.id;
          if (u.name == ‘LAX Owner') laxOwnerID=u.id;
        }




       for(Opportunity o:oppUpdate) accId.add(o.accountid);

       Map<Id,Account> accMap = new Map<Id,Account> (
           [Select Id, ownerid, property__c from Account where id in: accId]);

       for (Opportunity o:oppUpdate){
        o.description = 'This opportunity is used to track Ordered Ad Revenue';

        Account acc=accMap.get(o.accountid);
        if (acc !=null) {
           o.Opportunity_Type__c = acc.Property__c;

             User rep = repActiveMap.get(acc.ownerid);
             if (rep.IsActive) {
                acc.ownerid = rep.id;
             } else {
                if (acc.property__c == ‘PIT' && pitOwnerId !=null) o.ownerid = pitownerid;
                if (acc.property__c == ‘DEN' && denOwnerId !=null) o.ownerid = denownerid;
                if (acc.property__c == ‘LAX' && laxOwnerId !=null) o.ownerid = laxownerid;
         }

          if (recTypeId !=null) o.RecordTypeId = recTypeId;
        }
      }
      update oppUpdate;
  }




                                                                                                      7
8/31/2012




                                  APEX Code
Finish Method
global void finish(Database.BatchableContext ctx){
    AsyncApexJob a = [SELECT id, ApexClassId, JobItemsProcessed, TotalJobItems,
              NumberOfErrors, CreatedBy.Email
              FROM AsyncApexJob WHERE id = :ctx.getJobId()];

            string emailMessage = 'We executed ' + a.totalJobItems + ' batches.';

            Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
            String[] toAddresses = new String[] {a.createdBy.email};
            mail.setToAddresses(toAddresses);
            mail.setReplyTo('noreply@salesforce.com');
            mail.setSenderDisplayName('Batch Job Summary');
            mail.setSubject('Opportunity batch update complete');
            mail.setPlainTextBody(emailMessage);
            mail.setHtmlBody(emailMessage);
            Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
    }
}




                      Testing your Batch

        @ISTest
        public with sharing class TESTBatchOppLineZero {

            static testMethod void TESTBatchOppLineZero()
            {
              List<Account> actList = new List<Account>();
              *
              *
               Test.startTest();
                 Database.executeBatch(new BatchOppLineZero());
               Test.stopTest();

                 system.assertEquals(…..)
             }

        }




                                                                                             8
8/31/2012




 Governor (and other) Limits

• 5 active jobs
• Can’t call a batch from a batch
• 1M lines of code, 250k daily batches, 10k DML
  statements
• “One at a time”
• Subject to available resources
• Check the docs




           Scheduled Jobs

• After hours processing
• Daily / weekly / monthly jobs
• Asynchronous triggers
• Future jobs




                                                         9
8/31/2012




            Why Not Real Time?

• External processing
     – Third party updates
     – Delivery Status
• Just in time
• Balance resources
• Look at the business and its needs




                       APEX Code

global class BatchStageImportScheduler implements Schedulable {

    global void execute (SchedulableContext ctx)
    {
       BatchStageImport batchImport = new BatchStageImport();
       ID batchprocessid = Database.executeBatch(batchImport);
    }
}




                                                                        10
8/31/2012




                                APEX Code
    global void finish(Database.BatchableContext ctx){
     *
     *
     *
    // Schedule a job for 5 am tomorrow…
     Datetime sysTime = System.now();
     sysTime = sysTime.addDays(1);
     String chron_exp = '' + 0 + ' ' + 0 + ' ' + 5 + ' ' +
                        sysTime.day() + ' ' + sysTime.month() + ' ? ' + sysTime.year();

     BatchStageImportScheduler BatchSched = new BatchStageImportScheduler();

     // Schedule the next job, and give it the system time so name is unique
      System.schedule('BatchStageImport' + sysTime.getTime(),chron_exp,BatchSched);

     }
}




                          Monitoring Jobs

         • Check status
         • Cancel jobs
         • Error(s)

           Your name -> Setup ->             (Administration Setup)
                  Monitoring ->         Apex Jobs (or) Scheduled Jobs




                                                                                                11
8/31/2012




  Better User Experience

• Asynchronous Triggers
• Improved data quality
  – Enrichment
  – Cleansing
• Don’t make the customer wait




           Next Steps

• Investigate the Business Rules
  – Maybe this is not for you
• Make sure you test

• Don’t make the customer wait




                                         12
8/31/2012




  Questions?

   Mike Melnick

mikem@asktwice.com

   770-329-3664




                           13
Ad

More Related Content

What's hot (20)

Spring batch
Spring batchSpring batch
Spring batch
Chandan Kumar Rana
 
Spring batch showCase
Spring batch showCaseSpring batch showCase
Spring batch showCase
taher abdo
 
Spring batch in action
Spring batch in actionSpring batch in action
Spring batch in action
Mohammed Shoaib
 
Performance optimization (balancer optimization)
Performance optimization (balancer optimization)Performance optimization (balancer optimization)
Performance optimization (balancer optimization)
Vitaly Peregudov
 
Before you optimize: Understanding Execution Plans
Before you optimize: Understanding Execution PlansBefore you optimize: Understanding Execution Plans
Before you optimize: Understanding Execution Plans
Timothy Corey
 
Docker, Zabbix and auto-scaling
Docker, Zabbix and auto-scalingDocker, Zabbix and auto-scaling
Docker, Zabbix and auto-scaling
Vitaly Peregudov
 
Flink forward SF 2017: Elizabeth K. Joseph and Ravi Yadav - Flink meet DC/OS ...
Flink forward SF 2017: Elizabeth K. Joseph and Ravi Yadav - Flink meet DC/OS ...Flink forward SF 2017: Elizabeth K. Joseph and Ravi Yadav - Flink meet DC/OS ...
Flink forward SF 2017: Elizabeth K. Joseph and Ravi Yadav - Flink meet DC/OS ...
Flink Forward
 
Fault Tolerance and Job Recovery in Apache Flink @ FlinkForward 2015
Fault Tolerance and Job Recovery in Apache Flink @ FlinkForward 2015Fault Tolerance and Job Recovery in Apache Flink @ FlinkForward 2015
Fault Tolerance and Job Recovery in Apache Flink @ FlinkForward 2015
Till Rohrmann
 
Airflow presentation
Airflow presentationAirflow presentation
Airflow presentation
Ilias Okacha
 
Azkaban
AzkabanAzkaban
Azkaban
wyukawa
 
Repository performance tuning
Repository performance tuningRepository performance tuning
Repository performance tuning
Jukka Zitting
 
PyCon India 2012: Celery Talk
PyCon India 2012: Celery TalkPyCon India 2012: Celery Talk
PyCon India 2012: Celery Talk
Piyush Kumar
 
Functional? Reactive? Why?
Functional? Reactive? Why?Functional? Reactive? Why?
Functional? Reactive? Why?
Aleksandr Tavgen
 
The Many Ways to Test Your React App
The Many Ways to Test Your React AppThe Many Ways to Test Your React App
The Many Ways to Test Your React App
All Things Open
 
Spring batch
Spring batchSpring batch
Spring batch
Deepak Kumar
 
pgWALSync
pgWALSyncpgWALSync
pgWALSync
Rumman Iftekhar
 
Monitoring infrastructure with prometheus
Monitoring infrastructure with prometheusMonitoring infrastructure with prometheus
Monitoring infrastructure with prometheus
Shahnawaz Saifi
 
Square Peg Round Hole: Serverless Solutions For Non-Serverless Problems
Square Peg Round Hole: Serverless Solutions For Non-Serverless ProblemsSquare Peg Round Hole: Serverless Solutions For Non-Serverless Problems
Square Peg Round Hole: Serverless Solutions For Non-Serverless Problems
Chase Douglas
 
Crash reports pycodeconf
Crash reports pycodeconfCrash reports pycodeconf
Crash reports pycodeconf
lauraxthomson
 
Flink Forward SF 2017: Till Rohrmann - Redesigning Apache Flink’s Distributed...
Flink Forward SF 2017: Till Rohrmann - Redesigning Apache Flink’s Distributed...Flink Forward SF 2017: Till Rohrmann - Redesigning Apache Flink’s Distributed...
Flink Forward SF 2017: Till Rohrmann - Redesigning Apache Flink’s Distributed...
Flink Forward
 
Spring batch showCase
Spring batch showCaseSpring batch showCase
Spring batch showCase
taher abdo
 
Performance optimization (balancer optimization)
Performance optimization (balancer optimization)Performance optimization (balancer optimization)
Performance optimization (balancer optimization)
Vitaly Peregudov
 
Before you optimize: Understanding Execution Plans
Before you optimize: Understanding Execution PlansBefore you optimize: Understanding Execution Plans
Before you optimize: Understanding Execution Plans
Timothy Corey
 
Docker, Zabbix and auto-scaling
Docker, Zabbix and auto-scalingDocker, Zabbix and auto-scaling
Docker, Zabbix and auto-scaling
Vitaly Peregudov
 
Flink forward SF 2017: Elizabeth K. Joseph and Ravi Yadav - Flink meet DC/OS ...
Flink forward SF 2017: Elizabeth K. Joseph and Ravi Yadav - Flink meet DC/OS ...Flink forward SF 2017: Elizabeth K. Joseph and Ravi Yadav - Flink meet DC/OS ...
Flink forward SF 2017: Elizabeth K. Joseph and Ravi Yadav - Flink meet DC/OS ...
Flink Forward
 
Fault Tolerance and Job Recovery in Apache Flink @ FlinkForward 2015
Fault Tolerance and Job Recovery in Apache Flink @ FlinkForward 2015Fault Tolerance and Job Recovery in Apache Flink @ FlinkForward 2015
Fault Tolerance and Job Recovery in Apache Flink @ FlinkForward 2015
Till Rohrmann
 
Airflow presentation
Airflow presentationAirflow presentation
Airflow presentation
Ilias Okacha
 
Repository performance tuning
Repository performance tuningRepository performance tuning
Repository performance tuning
Jukka Zitting
 
PyCon India 2012: Celery Talk
PyCon India 2012: Celery TalkPyCon India 2012: Celery Talk
PyCon India 2012: Celery Talk
Piyush Kumar
 
Functional? Reactive? Why?
Functional? Reactive? Why?Functional? Reactive? Why?
Functional? Reactive? Why?
Aleksandr Tavgen
 
The Many Ways to Test Your React App
The Many Ways to Test Your React AppThe Many Ways to Test Your React App
The Many Ways to Test Your React App
All Things Open
 
Monitoring infrastructure with prometheus
Monitoring infrastructure with prometheusMonitoring infrastructure with prometheus
Monitoring infrastructure with prometheus
Shahnawaz Saifi
 
Square Peg Round Hole: Serverless Solutions For Non-Serverless Problems
Square Peg Round Hole: Serverless Solutions For Non-Serverless ProblemsSquare Peg Round Hole: Serverless Solutions For Non-Serverless Problems
Square Peg Round Hole: Serverless Solutions For Non-Serverless Problems
Chase Douglas
 
Crash reports pycodeconf
Crash reports pycodeconfCrash reports pycodeconf
Crash reports pycodeconf
lauraxthomson
 
Flink Forward SF 2017: Till Rohrmann - Redesigning Apache Flink’s Distributed...
Flink Forward SF 2017: Till Rohrmann - Redesigning Apache Flink’s Distributed...Flink Forward SF 2017: Till Rohrmann - Redesigning Apache Flink’s Distributed...
Flink Forward SF 2017: Till Rohrmann - Redesigning Apache Flink’s Distributed...
Flink Forward
 

Similar to Salesforce Batch processing - Atlanta SFUG (20)

Sql storeprocedure
Sql storeprocedureSql storeprocedure
Sql storeprocedure
ftz 420
 
Lazy vs. Eager Loading Strategies in JPA 2.1
Lazy vs. Eager Loading Strategies in JPA 2.1Lazy vs. Eager Loading Strategies in JPA 2.1
Lazy vs. Eager Loading Strategies in JPA 2.1
Patrycja Wegrzynowicz
 
Jdbc oracle
Jdbc oracleJdbc oracle
Jdbc oracle
yazidds2
 
Introduction to-mongo db-execution-plan-optimizer-final
Introduction to-mongo db-execution-plan-optimizer-finalIntroduction to-mongo db-execution-plan-optimizer-final
Introduction to-mongo db-execution-plan-optimizer-final
M Malai
 
Introduction to Mongodb execution plan and optimizer
Introduction to Mongodb execution plan and optimizerIntroduction to Mongodb execution plan and optimizer
Introduction to Mongodb execution plan and optimizer
Mydbops
 
Spring data requery
Spring data requerySpring data requery
Spring data requery
Sunghyouk Bae
 
Javascript
JavascriptJavascript
Javascript
Sun Technlogies
 
Unit test candidate solutions
Unit test candidate solutionsUnit test candidate solutions
Unit test candidate solutions
benewu
 
WINDOWS ADMINISTRATION AND WORKING WITH OBJECTS : PowerShell ISE
WINDOWS ADMINISTRATION AND WORKING WITH OBJECTS : PowerShell ISEWINDOWS ADMINISTRATION AND WORKING WITH OBJECTS : PowerShell ISE
WINDOWS ADMINISTRATION AND WORKING WITH OBJECTS : PowerShell ISE
Hitesh Mohapatra
 
Building a Complex, Real-Time Data Management Application
Building a Complex, Real-Time Data Management ApplicationBuilding a Complex, Real-Time Data Management Application
Building a Complex, Real-Time Data Management Application
Jonathan Katz
 
Intro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran MizrahiIntro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran Mizrahi
Ran Mizrahi
 
Synchronize applications with akeneo/batch
Synchronize applications with akeneo/batchSynchronize applications with akeneo/batch
Synchronize applications with akeneo/batch
gplanchat
 
Autonomous Transaction Processing (ATP): In Heavy Traffic, Why Drive Stick?
Autonomous Transaction Processing (ATP): In Heavy Traffic, Why Drive Stick?Autonomous Transaction Processing (ATP): In Heavy Traffic, Why Drive Stick?
Autonomous Transaction Processing (ATP): In Heavy Traffic, Why Drive Stick?
Jim Czuprynski
 
SFDC Advanced Apex
SFDC Advanced Apex SFDC Advanced Apex
SFDC Advanced Apex
Sujit Kumar
 
Alternate for scheduled apex using flow builder
Alternate for scheduled apex using flow builderAlternate for scheduled apex using flow builder
Alternate for scheduled apex using flow builder
KadharBashaJ
 
540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdf540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdf
hamzadamani7
 
Spring Batch in Code - simple DB to DB batch applicaiton
Spring Batch in Code - simple DB to DB batch applicaitonSpring Batch in Code - simple DB to DB batch applicaiton
Spring Batch in Code - simple DB to DB batch applicaiton
tomi vanek
 
Advance Sql Server Store procedure Presentation
Advance Sql Server Store procedure PresentationAdvance Sql Server Store procedure Presentation
Advance Sql Server Store procedure Presentation
Amin Uddin
 
Dapper performance
Dapper performanceDapper performance
Dapper performance
Suresh Loganatha
 
Jdbc Java Programming
Jdbc Java ProgrammingJdbc Java Programming
Jdbc Java Programming
chhaichivon
 
Sql storeprocedure
Sql storeprocedureSql storeprocedure
Sql storeprocedure
ftz 420
 
Lazy vs. Eager Loading Strategies in JPA 2.1
Lazy vs. Eager Loading Strategies in JPA 2.1Lazy vs. Eager Loading Strategies in JPA 2.1
Lazy vs. Eager Loading Strategies in JPA 2.1
Patrycja Wegrzynowicz
 
Jdbc oracle
Jdbc oracleJdbc oracle
Jdbc oracle
yazidds2
 
Introduction to-mongo db-execution-plan-optimizer-final
Introduction to-mongo db-execution-plan-optimizer-finalIntroduction to-mongo db-execution-plan-optimizer-final
Introduction to-mongo db-execution-plan-optimizer-final
M Malai
 
Introduction to Mongodb execution plan and optimizer
Introduction to Mongodb execution plan and optimizerIntroduction to Mongodb execution plan and optimizer
Introduction to Mongodb execution plan and optimizer
Mydbops
 
Unit test candidate solutions
Unit test candidate solutionsUnit test candidate solutions
Unit test candidate solutions
benewu
 
WINDOWS ADMINISTRATION AND WORKING WITH OBJECTS : PowerShell ISE
WINDOWS ADMINISTRATION AND WORKING WITH OBJECTS : PowerShell ISEWINDOWS ADMINISTRATION AND WORKING WITH OBJECTS : PowerShell ISE
WINDOWS ADMINISTRATION AND WORKING WITH OBJECTS : PowerShell ISE
Hitesh Mohapatra
 
Building a Complex, Real-Time Data Management Application
Building a Complex, Real-Time Data Management ApplicationBuilding a Complex, Real-Time Data Management Application
Building a Complex, Real-Time Data Management Application
Jonathan Katz
 
Intro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran MizrahiIntro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran Mizrahi
Ran Mizrahi
 
Synchronize applications with akeneo/batch
Synchronize applications with akeneo/batchSynchronize applications with akeneo/batch
Synchronize applications with akeneo/batch
gplanchat
 
Autonomous Transaction Processing (ATP): In Heavy Traffic, Why Drive Stick?
Autonomous Transaction Processing (ATP): In Heavy Traffic, Why Drive Stick?Autonomous Transaction Processing (ATP): In Heavy Traffic, Why Drive Stick?
Autonomous Transaction Processing (ATP): In Heavy Traffic, Why Drive Stick?
Jim Czuprynski
 
SFDC Advanced Apex
SFDC Advanced Apex SFDC Advanced Apex
SFDC Advanced Apex
Sujit Kumar
 
Alternate for scheduled apex using flow builder
Alternate for scheduled apex using flow builderAlternate for scheduled apex using flow builder
Alternate for scheduled apex using flow builder
KadharBashaJ
 
540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdf540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdf
hamzadamani7
 
Spring Batch in Code - simple DB to DB batch applicaiton
Spring Batch in Code - simple DB to DB batch applicaitonSpring Batch in Code - simple DB to DB batch applicaiton
Spring Batch in Code - simple DB to DB batch applicaiton
tomi vanek
 
Advance Sql Server Store procedure Presentation
Advance Sql Server Store procedure PresentationAdvance Sql Server Store procedure Presentation
Advance Sql Server Store procedure Presentation
Amin Uddin
 
Jdbc Java Programming
Jdbc Java ProgrammingJdbc Java Programming
Jdbc Java Programming
chhaichivon
 
Ad

More from vraopolisetti (17)

Concurforce - Atlanta ASUG Presentation
Concurforce - Atlanta ASUG PresentationConcurforce - Atlanta ASUG Presentation
Concurforce - Atlanta ASUG Presentation
vraopolisetti
 
Salesforce Adoption and Best Practices
Salesforce Adoption and Best PracticesSalesforce Adoption and Best Practices
Salesforce Adoption and Best Practices
vraopolisetti
 
Take Your Sales Pipeline Reporting to the Next Level 05-30-2012
Take Your Sales Pipeline Reporting to the Next Level   05-30-2012Take Your Sales Pipeline Reporting to the Next Level   05-30-2012
Take Your Sales Pipeline Reporting to the Next Level 05-30-2012
vraopolisetti
 
Getting your data into salesforce 5 30-2012
Getting your data into salesforce 5 30-2012Getting your data into salesforce 5 30-2012
Getting your data into salesforce 5 30-2012
vraopolisetti
 
Earning certifications efficiently 5.30.12 atlanta user group
Earning certifications efficiently 5.30.12 atlanta user groupEarning certifications efficiently 5.30.12 atlanta user group
Earning certifications efficiently 5.30.12 atlanta user group
vraopolisetti
 
Atlanta Salesforce UG Meeting 2/23/2011 Symplified
Atlanta Salesforce UG Meeting 2/23/2011 SymplifiedAtlanta Salesforce UG Meeting 2/23/2011 Symplified
Atlanta Salesforce UG Meeting 2/23/2011 Symplified
vraopolisetti
 
Atlanta Salesforce UG 2/23/2012: Release overview deck (spring '12)
Atlanta Salesforce UG 2/23/2012: Release overview deck (spring '12) Atlanta Salesforce UG 2/23/2012: Release overview deck (spring '12)
Atlanta Salesforce UG 2/23/2012: Release overview deck (spring '12)
vraopolisetti
 
Increasing reporting value with statistics
Increasing reporting value with statisticsIncreasing reporting value with statistics
Increasing reporting value with statistics
vraopolisetti
 
Atlanta user group presentation configero 8 nov11
Atlanta user group presentation configero 8 nov11Atlanta user group presentation configero 8 nov11
Atlanta user group presentation configero 8 nov11
vraopolisetti
 
building an app exchange app
building an app exchange appbuilding an app exchange app
building an app exchange app
vraopolisetti
 
Flow presentation
Flow presentationFlow presentation
Flow presentation
vraopolisetti
 
Who Sees What When? Using Dynamic Sharing Rules To Manage Access To Records
Who Sees What When? Using Dynamic Sharing Rules To Manage Access To Records Who Sees What When? Using Dynamic Sharing Rules To Manage Access To Records
Who Sees What When? Using Dynamic Sharing Rules To Manage Access To Records
vraopolisetti
 
Building Robust Applications with Dynamic Visualforce
Building Robust Applications with Dynamic Visualforce Building Robust Applications with Dynamic Visualforce
Building Robust Applications with Dynamic Visualforce
vraopolisetti
 
Build Amazing Website without coding using Salesforce SiteForce
Build Amazing Website without coding using Salesforce SiteForceBuild Amazing Website without coding using Salesforce SiteForce
Build Amazing Website without coding using Salesforce SiteForce
vraopolisetti
 
Configuration tips
Configuration tipsConfiguration tips
Configuration tips
vraopolisetti
 
Apttus atlanta sfdc user group pres feb 2011
Apttus atlanta sfdc user group pres feb 2011Apttus atlanta sfdc user group pres feb 2011
Apttus atlanta sfdc user group pres feb 2011
vraopolisetti
 
Marketing operations and resource management with salesforcecom
Marketing operations and resource management with salesforcecomMarketing operations and resource management with salesforcecom
Marketing operations and resource management with salesforcecom
vraopolisetti
 
Concurforce - Atlanta ASUG Presentation
Concurforce - Atlanta ASUG PresentationConcurforce - Atlanta ASUG Presentation
Concurforce - Atlanta ASUG Presentation
vraopolisetti
 
Salesforce Adoption and Best Practices
Salesforce Adoption and Best PracticesSalesforce Adoption and Best Practices
Salesforce Adoption and Best Practices
vraopolisetti
 
Take Your Sales Pipeline Reporting to the Next Level 05-30-2012
Take Your Sales Pipeline Reporting to the Next Level   05-30-2012Take Your Sales Pipeline Reporting to the Next Level   05-30-2012
Take Your Sales Pipeline Reporting to the Next Level 05-30-2012
vraopolisetti
 
Getting your data into salesforce 5 30-2012
Getting your data into salesforce 5 30-2012Getting your data into salesforce 5 30-2012
Getting your data into salesforce 5 30-2012
vraopolisetti
 
Earning certifications efficiently 5.30.12 atlanta user group
Earning certifications efficiently 5.30.12 atlanta user groupEarning certifications efficiently 5.30.12 atlanta user group
Earning certifications efficiently 5.30.12 atlanta user group
vraopolisetti
 
Atlanta Salesforce UG Meeting 2/23/2011 Symplified
Atlanta Salesforce UG Meeting 2/23/2011 SymplifiedAtlanta Salesforce UG Meeting 2/23/2011 Symplified
Atlanta Salesforce UG Meeting 2/23/2011 Symplified
vraopolisetti
 
Atlanta Salesforce UG 2/23/2012: Release overview deck (spring '12)
Atlanta Salesforce UG 2/23/2012: Release overview deck (spring '12) Atlanta Salesforce UG 2/23/2012: Release overview deck (spring '12)
Atlanta Salesforce UG 2/23/2012: Release overview deck (spring '12)
vraopolisetti
 
Increasing reporting value with statistics
Increasing reporting value with statisticsIncreasing reporting value with statistics
Increasing reporting value with statistics
vraopolisetti
 
Atlanta user group presentation configero 8 nov11
Atlanta user group presentation configero 8 nov11Atlanta user group presentation configero 8 nov11
Atlanta user group presentation configero 8 nov11
vraopolisetti
 
building an app exchange app
building an app exchange appbuilding an app exchange app
building an app exchange app
vraopolisetti
 
Who Sees What When? Using Dynamic Sharing Rules To Manage Access To Records
Who Sees What When? Using Dynamic Sharing Rules To Manage Access To Records Who Sees What When? Using Dynamic Sharing Rules To Manage Access To Records
Who Sees What When? Using Dynamic Sharing Rules To Manage Access To Records
vraopolisetti
 
Building Robust Applications with Dynamic Visualforce
Building Robust Applications with Dynamic Visualforce Building Robust Applications with Dynamic Visualforce
Building Robust Applications with Dynamic Visualforce
vraopolisetti
 
Build Amazing Website without coding using Salesforce SiteForce
Build Amazing Website without coding using Salesforce SiteForceBuild Amazing Website without coding using Salesforce SiteForce
Build Amazing Website without coding using Salesforce SiteForce
vraopolisetti
 
Apttus atlanta sfdc user group pres feb 2011
Apttus atlanta sfdc user group pres feb 2011Apttus atlanta sfdc user group pres feb 2011
Apttus atlanta sfdc user group pres feb 2011
vraopolisetti
 
Marketing operations and resource management with salesforcecom
Marketing operations and resource management with salesforcecomMarketing operations and resource management with salesforcecom
Marketing operations and resource management with salesforcecom
vraopolisetti
 
Ad

Recently uploaded (20)

Rusty Waters: Elevating Lakehouses Beyond Spark
Rusty Waters: Elevating Lakehouses Beyond SparkRusty Waters: Elevating Lakehouses Beyond Spark
Rusty Waters: Elevating Lakehouses Beyond Spark
carlyakerly1
 
HCL Nomad Web – Best Practices and Managing Multiuser Environments
HCL Nomad Web – Best Practices and Managing Multiuser EnvironmentsHCL Nomad Web – Best Practices and Managing Multiuser Environments
HCL Nomad Web – Best Practices and Managing Multiuser Environments
panagenda
 
Procurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptxProcurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptx
Jon Hansen
 
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
BookNet Canada
 
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath MaestroDev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
UiPathCommunity
 
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdfThe Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
Abi john
 
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-UmgebungenHCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
panagenda
 
Increasing Retail Store Efficiency How can Planograms Save Time and Money.pptx
Increasing Retail Store Efficiency How can Planograms Save Time and Money.pptxIncreasing Retail Store Efficiency How can Planograms Save Time and Money.pptx
Increasing Retail Store Efficiency How can Planograms Save Time and Money.pptx
Anoop Ashok
 
Heap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and DeletionHeap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and Deletion
Jaydeep Kale
 
Greenhouse_Monitoring_Presentation.pptx.
Greenhouse_Monitoring_Presentation.pptx.Greenhouse_Monitoring_Presentation.pptx.
Greenhouse_Monitoring_Presentation.pptx.
hpbmnnxrvb
 
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager APIUiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPathCommunity
 
Complete Guide to Advanced Logistics Management Software in Riyadh.pdf
Complete Guide to Advanced Logistics Management Software in Riyadh.pdfComplete Guide to Advanced Logistics Management Software in Riyadh.pdf
Complete Guide to Advanced Logistics Management Software in Riyadh.pdf
Software Company
 
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In France
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In FranceManifest Pre-Seed Update | A Humanoid OEM Deeptech In France
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In France
chb3
 
Electronic_Mail_Attacks-1-35.pdf by xploit
Electronic_Mail_Attacks-1-35.pdf by xploitElectronic_Mail_Attacks-1-35.pdf by xploit
Electronic_Mail_Attacks-1-35.pdf by xploit
niftliyevhuseyn
 
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul
 
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Impelsys Inc.
 
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc
 
TrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business ConsultingTrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business Consulting
Trs Labs
 
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Aqusag Technologies
 
Drupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy ConsumptionDrupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy Consumption
Exove
 
Rusty Waters: Elevating Lakehouses Beyond Spark
Rusty Waters: Elevating Lakehouses Beyond SparkRusty Waters: Elevating Lakehouses Beyond Spark
Rusty Waters: Elevating Lakehouses Beyond Spark
carlyakerly1
 
HCL Nomad Web – Best Practices and Managing Multiuser Environments
HCL Nomad Web – Best Practices and Managing Multiuser EnvironmentsHCL Nomad Web – Best Practices and Managing Multiuser Environments
HCL Nomad Web – Best Practices and Managing Multiuser Environments
panagenda
 
Procurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptxProcurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptx
Jon Hansen
 
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
BookNet Canada
 
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath MaestroDev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
UiPathCommunity
 
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdfThe Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
Abi john
 
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-UmgebungenHCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
panagenda
 
Increasing Retail Store Efficiency How can Planograms Save Time and Money.pptx
Increasing Retail Store Efficiency How can Planograms Save Time and Money.pptxIncreasing Retail Store Efficiency How can Planograms Save Time and Money.pptx
Increasing Retail Store Efficiency How can Planograms Save Time and Money.pptx
Anoop Ashok
 
Heap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and DeletionHeap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and Deletion
Jaydeep Kale
 
Greenhouse_Monitoring_Presentation.pptx.
Greenhouse_Monitoring_Presentation.pptx.Greenhouse_Monitoring_Presentation.pptx.
Greenhouse_Monitoring_Presentation.pptx.
hpbmnnxrvb
 
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager APIUiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPathCommunity
 
Complete Guide to Advanced Logistics Management Software in Riyadh.pdf
Complete Guide to Advanced Logistics Management Software in Riyadh.pdfComplete Guide to Advanced Logistics Management Software in Riyadh.pdf
Complete Guide to Advanced Logistics Management Software in Riyadh.pdf
Software Company
 
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In France
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In FranceManifest Pre-Seed Update | A Humanoid OEM Deeptech In France
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In France
chb3
 
Electronic_Mail_Attacks-1-35.pdf by xploit
Electronic_Mail_Attacks-1-35.pdf by xploitElectronic_Mail_Attacks-1-35.pdf by xploit
Electronic_Mail_Attacks-1-35.pdf by xploit
niftliyevhuseyn
 
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul
 
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Enhancing ICU Intelligence: How Our Functional Testing Enabled a Healthcare I...
Impelsys Inc.
 
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc
 
TrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business ConsultingTrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business Consulting
Trs Labs
 
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Aqusag Technologies
 
Drupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy ConsumptionDrupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy Consumption
Exove
 

Salesforce Batch processing - Atlanta SFUG

  • 1. 8/31/2012 Using Batch Jobs to Improve the User Experience Safe Harbor I've always said to anyone that will listen to me (which is not very many) that software is an art form. It attracts artists. Just look at any software company and the amount of musicians, artists, carpenters, etc… working there that create code for a living and create other things in their down time. - Steve Lacey 1
  • 2. 8/31/2012 A developer can now employ batch Apex to build complex, long-running processes on the Force.com platform. - Force.com Apex Code Developers Guide Complex, Long Running tasks • Pre or Post processing tasks • Account reassignments • Price book updates • Custom or Transactional Objects Governor Limits are Your Friends … 2
  • 3. 8/31/2012 Scenario 1 • 324,476 Accounts • 142,105 Opportunity records • 1 NEW record type Administrative Use • Nulling out a field • Arghhhh!!!!! 3
  • 4. 8/31/2012 Developer Objects • Batch Process(es) • Something to fire it – Trigger – Schedule – VisualForce Page • Test Class Batch Process • Start – Define the records to process • Execute – “Long, Complex…” • Finish – Post processing – e-Mail status – Schedule a repeat job, etc 4
  • 5. 8/31/2012 APEX Code global class BatchOppLineZero implements Database.Batchable<SObject> { global final string query; global boolean process_on; List<OpportunityLineItemSchedule> schList = new List<OpportunityLineItemSchedule> (); private string query1 = 'Select Id, scheduledate, revenue from OpportunityLineItemSchedule'; global BatchOppLineZero () { if (system.Test.isRunningTest()) { this.query = query1 + ' where scheduledate >= :chkDate'; } else { this.query = query1 + ' where scheduledate >= :testDate'; } } * * APEX Code Start Method global Database.queryLocator start(Database.BatchableContext ctx){ Date myDate = date.today(); Date chkDate = date.newinstance (mydate.year(),mydate.month(),1).addmonths(-3); return Database.getQueryLocator(query); } 5
  • 6. 8/31/2012 APEX Code Execute Method global void execute(Database.BatchableContext ctx, List<Sobject> scope){ schList = (List<OpportunityLineItemSchedule>)scope; for (OpportunityLineItemSchedule lis:schList) lis.revenue=0; update schList; } Scenario 1 n opportunity records need to be updated • Record type needs to be changed • OwnerId updated – Should be the account owner – Default for account location if owner is inactive • Opportunity type should reflect account property 6
  • 7. 8/31/2012 Execute Method – scenario 1 global void execute(Database.BatchableContext ctx, List<Sobject> scope){ oppUpdate = (List<Opportunity>)scope; List<Account> accList = new List<Account>(); Set<Id> accId = new set<id>(); ID recTypeId; List<RecordType> recList = new List<RecordType> ([Select Id, Name from RecordType]); for (RecordType rec:recList) if (rec.name=='Ad Revenue') recTypeId=rec.id; ID pitOwnerID, denOwnerID, laxOwnerID; List<User> repList = [Select ID, name, Property__c, IsActive, Sales_id__c from User]; MAP<string,User> repMap = new MAP<string,User>(); MAP<Id,User> repActiveMap = new MAP<Id,User>(); for (User u:repList) { repMap.put(u.UserNumber__c,u); repActiveMap.put(u.id,u); if (u.name == ‘PIT Owner') pitOwnerID=u.id; if (u.name == ‘DEN Owner') denOwnerID=u.id; if (u.name == ‘LAX Owner') laxOwnerID=u.id; } for(Opportunity o:oppUpdate) accId.add(o.accountid); Map<Id,Account> accMap = new Map<Id,Account> ( [Select Id, ownerid, property__c from Account where id in: accId]); for (Opportunity o:oppUpdate){ o.description = 'This opportunity is used to track Ordered Ad Revenue'; Account acc=accMap.get(o.accountid); if (acc !=null) { o.Opportunity_Type__c = acc.Property__c; User rep = repActiveMap.get(acc.ownerid); if (rep.IsActive) { acc.ownerid = rep.id; } else { if (acc.property__c == ‘PIT' && pitOwnerId !=null) o.ownerid = pitownerid; if (acc.property__c == ‘DEN' && denOwnerId !=null) o.ownerid = denownerid; if (acc.property__c == ‘LAX' && laxOwnerId !=null) o.ownerid = laxownerid; } if (recTypeId !=null) o.RecordTypeId = recTypeId; } } update oppUpdate; } 7
  • 8. 8/31/2012 APEX Code Finish Method global void finish(Database.BatchableContext ctx){ AsyncApexJob a = [SELECT id, ApexClassId, JobItemsProcessed, TotalJobItems, NumberOfErrors, CreatedBy.Email FROM AsyncApexJob WHERE id = :ctx.getJobId()]; string emailMessage = 'We executed ' + a.totalJobItems + ' batches.'; Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage(); String[] toAddresses = new String[] {a.createdBy.email}; mail.setToAddresses(toAddresses); mail.setReplyTo('[email protected]'); mail.setSenderDisplayName('Batch Job Summary'); mail.setSubject('Opportunity batch update complete'); mail.setPlainTextBody(emailMessage); mail.setHtmlBody(emailMessage); Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail }); } } Testing your Batch @ISTest public with sharing class TESTBatchOppLineZero { static testMethod void TESTBatchOppLineZero() { List<Account> actList = new List<Account>(); * * Test.startTest(); Database.executeBatch(new BatchOppLineZero()); Test.stopTest(); system.assertEquals(…..) } } 8
  • 9. 8/31/2012 Governor (and other) Limits • 5 active jobs • Can’t call a batch from a batch • 1M lines of code, 250k daily batches, 10k DML statements • “One at a time” • Subject to available resources • Check the docs Scheduled Jobs • After hours processing • Daily / weekly / monthly jobs • Asynchronous triggers • Future jobs 9
  • 10. 8/31/2012 Why Not Real Time? • External processing – Third party updates – Delivery Status • Just in time • Balance resources • Look at the business and its needs APEX Code global class BatchStageImportScheduler implements Schedulable { global void execute (SchedulableContext ctx) { BatchStageImport batchImport = new BatchStageImport(); ID batchprocessid = Database.executeBatch(batchImport); } } 10
  • 11. 8/31/2012 APEX Code global void finish(Database.BatchableContext ctx){ * * * // Schedule a job for 5 am tomorrow… Datetime sysTime = System.now(); sysTime = sysTime.addDays(1); String chron_exp = '' + 0 + ' ' + 0 + ' ' + 5 + ' ' + sysTime.day() + ' ' + sysTime.month() + ' ? ' + sysTime.year(); BatchStageImportScheduler BatchSched = new BatchStageImportScheduler(); // Schedule the next job, and give it the system time so name is unique System.schedule('BatchStageImport' + sysTime.getTime(),chron_exp,BatchSched); } } Monitoring Jobs • Check status • Cancel jobs • Error(s) Your name -> Setup -> (Administration Setup) Monitoring -> Apex Jobs (or) Scheduled Jobs 11
  • 12. 8/31/2012 Better User Experience • Asynchronous Triggers • Improved data quality – Enrichment – Cleansing • Don’t make the customer wait Next Steps • Investigate the Business Rules – Maybe this is not for you • Make sure you test • Don’t make the customer wait 12
  • 13. 8/31/2012 Questions? Mike Melnick [email protected] 770-329-3664 13