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
Padmini S 26Padmini S 26 

batch apex class with upsert

Hi All,

I have 4 objects Forecast__c, ForeCast_Details__C, Opportunity and Opportunity_Forecast__c.  Opportunity object contains multiple Opportunity_Forecast__c. Forecast__c has looup to Opportunity Object. Now i have to write batch apex class with upsert the ForeCast_Details__C  object records with value of Opportunity_Forecast__c.Could anyone please help on this.

Thanks in Advance.
Vinod Chokkula 3Vinod Chokkula 3
global class forecastDetailsBatch implements Database.Batchable<sObject>{
String query = select id,Opportunity_Forecast__c,Opportunity_Forecast__r.name from Opportunity; //include all the required fields in the query


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

global void execute(Database.BatchableContext BC, List<sObject> scope){
    List<ForeCast_Details__C> foreCastDetailsToInsert = new List<ForeCast_Details__C>();

   for(Opportunity s : scope)
    {
      for(Opportunity_Forecast__c of: s.Opportunity_Forecast__c){
                  ForeCast_Details__C f = new ForeCast_Details__C();
                   f.name = of.name; //set all other fields, id for upsert                 
   foreCastDetailsToInsert.add(f);             }
        }

if(!foreCastDetailsToInsert .isEmpty){
     upsert foreCastDetailsToInsert ;
}
    
}
global void finish(Database.BatchableContext BC){
}
}
Padmini S 26Padmini S 26
Hi Vinod,

I have written below batch class. But still i am getting error as  Loop must iterate over collection: Id at line 14 column 7. Please suggest me.
global class ADMGuidanceForecastBatch implements Database.Batchable<sObject>{

String query = 'select id,Name,(select id, Name from Opportunity_Forecast__c) from Opportunity'; 


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

global void execute(Database.BatchableContext BC, List<sObject> scope){
    List<Forecast_Detail__c> foreCastDetailsToInsert = new List<Forecast_Detail__c>();

   for(Opportunity s : scope)
    {
      for(Opportunity_Forecast__c oppforecast: s.Master_Opportunity__c){
                  Forecast_Detail__c f = new Forecast_Detail__c();
                  //f.Id = f.Id;
                  f.M1__c = oppforecast.Quantity__c;                 
                  foreCastDetailsToInsert.add(f);             
   }
        }

if(!foreCastDetailsToInsert .isEmpty){
     update foreCastDetailsToInsert ;
}
    
}
global void finish(Database.BatchableContext BC){
}
}

 
Vinod Chokkula 3Vinod Chokkula 3
Change the relationship in line 3 and 14 from Opportunity_Forecast__c to Opportunity_Forecasts__r