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
tdevmantdevman 

too many script statements

I have a before trigger that calls this class which auto assigns the region and the ownerid to the account based on the recordtype, state and zip of the region object. the region object holds all the assignments. It works great but when I execute a batch load through data laoder I hit too many script statements 200001 error. any way i can fix?

 

 

public with sharing class AccountUtilities
{
public static void acctAssign(List<Account> aList)
{
List<region__c> rList = [select id, zip_start__c, zip_end__c, state__c,sales_user__c, business_unit__c, recordTypeId from region__c];
Map<Id,RecordType> rtMap = new Map<Id,RecordType>([Select id,Name from RecordType where sObjectType IN ('Account','region__c')]);
for(Account a:aList)
{
try
{
for(integer i= 0; i< rList.size(); i++)
{
String billingPostalCode= String.valueOf(a.BillingPostalCode);
if(a.billingstate== rList.get(i).state__c && a.Protected__c != true && rtMap.get(a.recordtypeid).Name == rtMap.get(rList.get(i).recordtypeid).Name && a.business_unit__c == tList.get(i).business_unit__c)
{
if(a.billingPostalCode >= rList.get(i).zip_start__c && a.billingPostalCode<=rList.get(i).zip_end__c || rList.get(i).zip_start__c ==null && rList.get(i).zip_end__c ==null )
{
a.region__c = rList.get(i).id;
a.OwnerId = rList.get(i).sales_user__c;
}
}
}
}
catch (System.Exception e)
{
// process exception
}

}
}



Ron HessRon Hess

sounds too simple, but you can set the batch size in the data loader to a smaller number and try again.

tdevmantdevman

Thank you. I was able to set the batch size to 150 and looks like it's working. However, from scalability perspective would I be able to set a higher batch size to speed up the batch load. I plan on utilizing the bulk api as well. Just wondering if there is a better way to process.would using a map collection process quicker rather and a upating a list?

SiddharthSiddharth

I see couple of things that you can optimize in your code. 

 

  1. Put Break in the Inner For Loop, this would stop unnecessary execution of loops and will cut down number of script lines being executed.
  2. You can build Multiple sets of parameters from account data and then execute your query on Region object. This would fetch just the desired set of data from Region record and will agains cut the no of times a loop needs to be executed.

 

I am sure you would be able to execute your code to an upper batch range post these changes.