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
hmoh1920hmoh1920 

batch: First error: Too many script statements: 1000001

Hi,

I coded this batch:

 

global class BalanceCalculBatchV3 implements Database.Batchable<sObject>{
String IDVar;
decimal var1=0, var2=0;
date dateEcheance;

        
global final String query ='SELECT id,name FROM Opportunity limit 4';        

global Database.querylocator start(Database.BatchableContext BC){
            return Database.getQueryLocator(query);}

global void execute(Database.BatchableContext BC, List<Sobject> scope){

 List<Opportunity> opps = [select id,  Date_d_ech_ance_de_la_police__c, Total_montant_pay__c
                            from Opportunity];
   
 
 
 List<paiement__c> paiement = [SELECT Id, CreatedDate, montant_pay__c ,Encaissement_remboursement__c, Montant_rem__c,
                                        Opportunit__c FROM paiement__c];  
                                        
                        
 List<Quittance__c> quittance = [SELECT Id, Date_due1__c, Date_due10__c, Date_due11__c, Date_due12__c, Date_due2__c,
                                   Date_due3__c, Date_due4__c, Date_due5__c, Date_due6__c, Date_due7__c, Date_due8__c,
                                   Date_due9__c, Date_pay_del__c, DateDue__c, Echeance_paiement__c, Echeance1__c,
                                   Echeance10__c, Echeance11__c, Echeance12__c, Echeance2__c, Echeance3__c, Echeance4__c,
                                   Echeance5__c, Echeance6__c, Echeance7__c, Echeance8__c, Echeance9__c, Opportunit__c,
                                   Facturation_Avoir__c, Montant_d_avoir__c
                                   FROM Quittance__c];
 
 
/******************************************************************************************************************************/
    
    Integer l;
    l = opps.size();
if(l!=Null) {                       
    for (Integer i = 0; i<l; i++)
              {
                  IDVar=opps[i].Id;
                          
             Integer m;
             m = paiement.size();
if(m!=Null) {                      
         for (Integer s = 0; s<m; s++)
              {
              if(paiement[s].Opportunit__c== IDVar)
              {
                  
                         if(paiement[s].Encaissement_remboursement__c=='Encaissement')
                           {
                                var1 += paiement[s].montant_pay__c;
                           }
                         if(paiement[s].Encaissement_remboursement__c=='Remboursement')
                           {
                                var1 -= paiement[s].Montant_rem__c;
                           }
                }
               }
           }                                       
/******************************************************************************************************************************/                  
    dateEcheance=opps[i].Date_d_ech_ance_de_la_police__c;      

          
/******************************************************************************************************************************/                   
//calcul au niveau de la quittance.
Integer h;
h = quittance.size();     
if(h!=null)
{
     for (Integer n = 0; n<h; n++)
         {

           if (quittance[n].Opportunit__c== IDVar)
             {
        
           if(quittance[n].Facturation_Avoir__c=='Avoir')
             {
               var2 -= quittance[n].Montant_d_avoir__c;
             }
           if(quittance[n].Facturation_Avoir__c=='Facturation')
             {
/****************************************En fonction des 4 modes de paiement*****************************************/
/*******************************************Paiement annuel*********************************************************/

               if (quittance[n].Echeance_paiement__c =='Annuel' && quittance[n].Date_due1__c<=datetime.now())
                {
                      var2+=quittance[n].Echeance1__c;
                }

/******************************************Paiement Semestriel*******************************************************/

         if (quittance[n].Echeance_paiement__c =='Semestriel' && quittance[n].Date_due1__c<=datetime.now())
          {
              if(quittance[n].Date_due2__c<=datetime.now())
               {
                var2+=quittance[n].Echeance1__c+quittance[n].Echeance2__c;
               }else
               {
                var2+=quittance[n].Echeance1__c;
               }
          }
   // other traitement

                   
                          }
}                          
                    }
}
//calcul du montant final
opps[i].Total_montant_pay__c = var1-var2;  
 
                           
/****************************************************************************************************************/                  
                  
var1=0;
var2=0;
              }
}  

        List<Database.SaveResult> dsrs = Database.update(opps, false);
 


    
}

}

 

 

i have an  800 opportunity in my objet Opportunity;

 

when executing, I get this error:  First error: Too many script statements: 1000001.

please help me to resolve this problem.

 

thanks.

TheIntegratorTheIntegrator

Can you check how many paiement records you have, i'm guessing its more than 1250. 800*1250 = 1000000

hmoh1920hmoh1920
What are the limits of the number of records so that I can processed ?



hmoh1920hmoh1920

i have exactly  800 opportunity, 760 quittance and 758 paiement!

TheIntegratorTheIntegrator

yeah, so the code iterates through 800 opportunities and inside that loop you have 758 paiement so the 5 lines of code inside that loop is executed 800*758 times , which makes over 3 million lines of code. Further, you have 760 quittance, that need to loop for each of 800 opportunities.

 

I suggest you use maps

 

Map<String,paiement__c> pMap = new Map<String,paiement__c> {};

for(paiement__c p: paiement){
    pMap.put(p.Opportunit__c, p);
}

 

then, instead of having a for loop like this

Integer m;
             m = paiement.size();
if(m!=Null) {                      
         for (Integer s = 0; s<m; s++)
              {
              if(paiement[s].Opportunit__c== IDVar)
              {
                  
                         if(paiement[s].Encaissement_remboursement__c=='Encaissement')
                           {
                                var1 += paiement[s].montant_pay__c;
                           }
                         if(paiement[s].Encaissement_remboursement__c=='Remboursement')
                           {
                                var1 -= paiement[s].Montant_rem__c;
                           }
                }
               }
           }  

 

use map to check for opportunity , something like this

if(pMap.containsKey(IDVar))
              {
                  
                   paiement__c tmpP = pMap.get(IDVar);           if(tmpP.Encaissement_remboursement__c=='Encaissement')
                           {
                                var1 += tmpP.montant_pay__c;
                           }
                         if(tmpP.Encaissement_remboursement__c=='Remboursement')
                           {
                                tmpP -= tmpP.Montant_rem__c;
                           }
                }

 this takes away the nest loop, making the code more efficient and keeping you under the limits. Repeat the same for quittance 

 

 

 

 


hmoh1920hmoh1920

Hi Thelntegrator,

 

I tried what you told me, but I have an error in the result values​​of  when running!

 

 

this my code

 

global class BalanceCalculBatchV4 implements Database.Batchable<sObject>{
String IDVar;
decimal var1=0, var2=0;
date dateEcheance;


       
global final String query ='SELECT id,name FROM Opportunity limit 4';        

global Database.querylocator start(Database.BatchableContext BC){
            return Database.getQueryLocator(query);}

global void execute(Database.BatchableContext BC, List<Sobject> scope){

 List<Opportunity> opps = [select id,  Date_d_ech_ance_de_la_police__c, Total_montant_pay__c
                            from Opportunity];
   
 
 
 List<paiement__c> paiement = [SELECT Id, CreatedDate, montant_pay__c ,Encaissement_remboursement__c, Montant_rem__c,
                                        Opportunit__c FROM paiement__c];  
                                        
                        
 List<Quittance__c> quittance = [SELECT Id, Date_due1__c, Date_due10__c, Date_due11__c, Date_due12__c, Date_due2__c,
                                   Date_due3__c, Date_due4__c, Date_due5__c, Date_due6__c, Date_due7__c, Date_due8__c,
                                   Date_due9__c, Date_pay_del__c, DateDue__c, Echeance_paiement__c, Echeance1__c,
                                   Echeance10__c, Echeance11__c, Echeance12__c, Echeance2__c, Echeance3__c, Echeance4__c,
                                   Echeance5__c, Echeance6__c, Echeance7__c, Echeance8__c, Echeance9__c, Opportunit__c,
                                   Facturation_Avoir__c, Montant_d_avoir__c
                                   FROM Quittance__c];
 
 
/******************************************************************************************************************************/
Map<ID,paiement__c> pMap = new Map<ID,paiement__c> {};

for(paiement__c p: paiement){
    pMap.put(p.Opportunit__c, p);
}


Map<ID,Quittance__c> qMap = new Map<ID,Quittance__c> {};

for(Quittance__c q: quittance){
    qMap.put(q.Opportunit__c, q);
}

    
    Integer l;
    l = opps.size();
if(l!=Null) {                       
    for (Integer i = 0; i<l; i++)
              {
                  IDVar=opps[i].Id;
                          
             Integer m;
             m = paiement.size();
if(m!=Null) {
if(pMap.containsKey(IDVar))
              {
                  
                   paiement__c tmpP = pMap.get(IDVar);
                               
                   if(tmpP.Encaissement_remboursement__c=='Encaissement')
                           {
                                var1 += tmpP.montant_pay__c;
                           }
                         if(tmpP.Encaissement_remboursement__c=='Remboursement')
                           {
                                var1  -= tmpP.Montant_rem__c;
                           }
             
                }                      
       
           }                                       
/******************************************************************************************************************************/                  
    dateEcheance=opps[i].Date_d_ech_ance_de_la_police__c;      

          
/******************************************************************************************************************************/                   
//calcul au niveau de la quittance.
Integer h;
h = quittance.size();     
if(h!=null)
{
/********************ajout new code *************************/
if(qMap.containsKey(IDVar))
              {
                  
                   Quittance__c tmpQ = qMap.get(IDVar);  
 
           if(tmpQ.Facturation_Avoir__c=='Avoir')
             {
               var2 -= tmpQ.Montant_d_avoir__c;
             }
           if(tmpQ.Facturation_Avoir__c=='Facturation')
             {
/****************************************En fonction des 4 modes de paiement*****************************************/
/*******************************************Paiement annuel*********************************************************/

               if (tmpQ.Echeance_paiement__c =='Annuel' && tmpQ.Date_due1__c<=datetime.now())
                {
                      var2+=tmpQ.Echeance1__c;
                }

/******************************************Paiement Semestriel*******************************************************/

         if (tmpQ.Echeance_paiement__c =='Semestriel' && tmpQ.Date_due1__c<=datetime.now())
          {
              if(tmpQ.Date_due2__c<=datetime.now())
               {
                var2+=tmpQ.Echeance1__c+tmpQ.Echeance2__c;
               }else
               {
                var2+=tmpQ.Echeance1__c;
               }
          }
   
//my code to quittance                   
                          }
             
}                          
                  

/*****************************************************/                    
                    
                    }
//calcul du montant final
opps[i].Total_montant_pay__c = var1-var2;  
 
                           
/****************************************************************************************************************/                  
                  
var1=0;
var2=0;
              }
}  

        List<Database.SaveResult> dsrs = Database.update(opps, false);
     
 
}
global void finish(Database.BatchableContext BC){
    
 
   
}



}

 

 

 

 

 

thanks

hmoh1920hmoh1920

Hi,

 

The problem is i have SEVERAL paiement_c and  quittance_c recording go at once to the same calculation, and I think using the map I not all walk records for a single code Opportunit__c.

 

 

how to declare a list of the interior map if possible?

 

 

 

thanks.

 

moh.