function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
alxalx 

DML Overflow, help!

Hey everyone,

 

The workhorse for my scheduled counter is giving me DML 101 issues. Anyone know how i can bulkify the following code?

 

 

global class countAgreements implements Database.Batchable<sObject>{
	global final String gstrQuery = 'select ID, Number_of_Agreements__c from Opportunity';
    global Database.QueryLocator start(Database.BatchableContext BC){
		return Database.getQueryLocator(gstrQuery);
    } 
	global void execute(Database.BatchableContext BC, List<sObject> scope){
		List<Opportunity> listOpp = new List<Opportunity>();
		for(SObject objSObject : scope){
			Opportunity objOpportunity = (Opportunity)objSObject;
			Integer intNumberOfAgreements = [SELECT count() FROM echosign_dev1__SIGN_Agreement__c WHERE OpportunityID = :objOpportunity.ID and Is_Type_NDA__c = 1];
			if (intNumberOfAgreements <> objOpportunity.Number_of_Agreements__c){
				objOpportunity.Number_of_Agreements__c = intNumberOfAgreements;
				listOpp.add(objOpportunity);
			}
		if (listOpp.size()>0) {update listOpp;}
		}
	}
	global void finish(Database.BatchableContext BC){
	}
}

 

 

 

any help is greatly appreciated.

Best Answer chosen by Admin (Salesforce Developers) 
Tim__mTim__m

Move your update statement outside of the loop.

 

 

global void execute(Database.BatchableContext BC, List<sObject> scope){
List<Opportunity> listOpp = new List<Opportunity>();
for(SObject objSObject : scope){
Opportunity objOpportunity = (Opportunity)objSObject;
Integer intNumberOfAgreements = [SELECT count() FROM echosign_dev1__SIGN_Agreement__c WHERE OpportunityID = :objOpportunity.ID and Is_Type_NDA__c = 1];
if (intNumberOfAgreements <> objOpportunity.Number_of_Agreements__c){
objOpportunity.Number_of_Agreements__c = intNumberOfAgreements;
listOpp.add(objOpportunity);
}
}
if (listOpp.size()>0) {update listOpp;}
}

 

 

All Answers

Tim__mTim__m

Move your update statement outside of the loop.

 

 

global void execute(Database.BatchableContext BC, List<sObject> scope){
List<Opportunity> listOpp = new List<Opportunity>();
for(SObject objSObject : scope){
Opportunity objOpportunity = (Opportunity)objSObject;
Integer intNumberOfAgreements = [SELECT count() FROM echosign_dev1__SIGN_Agreement__c WHERE OpportunityID = :objOpportunity.ID and Is_Type_NDA__c = 1];
if (intNumberOfAgreements <> objOpportunity.Number_of_Agreements__c){
objOpportunity.Number_of_Agreements__c = intNumberOfAgreements;
listOpp.add(objOpportunity);
}
}
if (listOpp.size()>0) {update listOpp;}
}

 

 

This was selected as the best answer
alxalx

ugh, i feel like a dumbass.

 

thanks tim, i'll give it a try.

Tim__mTim__m

Sometimes you just need a second pair of eyes. I know I do.