I’ve put together a batch class that’s great for quick records updates, without using the dataloader! This comes in handy when a new trigger or workflow is setup and an action needs applied to a large amount of records. Generally, to accomplish this a user would have to export the records with Ids in question either through a report or the dataloader then send them through the dataloader in an update. With this class however, an administrator can plug in a simple query like ‘SELECT Id FROM Contact’ and run the below from the Developer Console, or another third party tool like the SqolXplorer by executing the following command:
string query = 'SELECT Id FROM Contact'; ID idBatch = Database.executeBatch(new util_sObjectUpdaterBatch(query), 200);
Here’s the class code, which can also be found on my GitHub here:
global class util_sObjectUpdaterBatch implements Database.Batchable<sobject>{ /** Run This Batch string query = ''; ID idBatch = Database.executeBatch(new util_sObjectUpdaterBatch(query), 200); **/ global string query; global util_sObjectUpdaterBatch(string q) { query = q; } global Database.QueryLocator start(Database.BatchableContext bcMain) { return Database.getQueryLocator(query); } global void execute(Database.BatchableContext bcMain, List<sObject> scope) { if(scope.size() > 0) { update scope; } } global void finish(Database.BatchableContext bcMain) { } }
Here’s the test class:
@isTest private class testutil_sObjectUpdaterBatch{ static account acct; static list<contact> contacts; private static void init(){ acct = new account( name = 'Test Account' ); insert acct; contacts = new list<contact>(); for(integer i = 0; i < 200; i++){ contacts.add(new contact( firstName = 'Sample', lastName = 'Contact - '+i, accountId = acct.id )); } insert contacts; } @isTest static void test_util_sObjectUpdaterBatch() { init(); test.startTest(); string query = 'SELECT Id FROM Contact'; id thisBatchId = Database.executeBatch(new util_sObjectUpdaterBatch(query), 200); test.stopTest(); //make sure there are 200 contacts system.assertEquals(200,contacts.size()); asyncApexJob thisJob = [SELECT id, status, jobItemsProcessed, numberOfErrors, totalJobItems FROM asyncApexJob WHERE id =: thisBatchId]; //make sure job was completed system.assertEquals('Completed',thisJob.status); //make sure 1 job was processed system.assertEquals(1,thisJob.jobItemsProcessed); //make sure there were 0 errors system.assertEquals(0,thisJob.numberOfErrors); } }
In my next post I’ll show you how to run updates and change field values through a batch class! Which is now up here, Updating Records via Batch Apex Part 2: Field Changes.
Be First to Comment