You need to sign in to do that
Don't have an account?
Ben Wild 8
Trigger not running on Sheduled Batch apex record update
I have a trigger that updates a field on my line items to say what quarter they are in relative to the current quarter (so that I can use roll up summaries to show totals in fields on the opportunity page). The trigger consists of a very long if statement in order to fit in all the criteria to allow for going round end of calendar years etc. The trigger runs before update and works very well if a record is edited through the UI or updated using the data loader.
The issue I am having is I want it to run across all records at the start of each quarter as the value becomes incorrect as we go in to a new quarter so the trigger has to run again to update. Currently I just run an update with the data loader but I would like to to be automated. I wrote a Batch apex class that I scheduled to run every day and if the date is the start of a quarter, run an update on all of the opportunity line items in an attempt to have the trigger run. The Batch class runs as it should but I cant seem to get the trigger to run, I'm not getting any errors so I'm a bit confused as to what is going wrong.
My code below (apolgies for any glaring errors or bad practice, batch scheduled apex is new to me):
I have tried chnaging the batch size (hence why it is currently 1) in case I was hitting any limits but that didnt seem to help. Any ideas?
Thanks,
Ben
The issue I am having is I want it to run across all records at the start of each quarter as the value becomes incorrect as we go in to a new quarter so the trigger has to run again to update. Currently I just run an update with the data loader but I would like to to be automated. I wrote a Batch apex class that I scheduled to run every day and if the date is the start of a quarter, run an update on all of the opportunity line items in an attempt to have the trigger run. The Batch class runs as it should but I cant seem to get the trigger to run, I'm not getting any errors so I'm a bit confused as to what is going wrong.
My code below (apolgies for any glaring errors or bad practice, batch scheduled apex is new to me):
//BATCH APEX CLASS global class UpdateOpportunityLineItems implements Database.Batchable<sObject>, Database.Stateful { // instance member to retain state across transactions global Integer recordsProcessed = 0; global Database.QueryLocator start(Database.BatchableContext bc) { //Get the opportunities from the database return Database.getQueryLocator( 'SELECT ID, Trigger_Update__c, Date_Today__c FROM OpportunityLineItem '); } global void execute(Database.BatchableContext bc, List<OpportunityLineItem> opp){ // Process each batch of records List<OpportunityLineItem> oppLineItemsToUpdate = new List<OpportunityLineItem>(); for (OpportunityLineItem oppLineItem : opp) { if (oppLineItem.Date_Today__c == Date.newInstance(Date.Today().year(), 11, 15)){ oppLineItem.Trigger_Update__c = TRUE; oppLineItemsToUpdate.add(oppLineItem); } else if (oppLineItem.Date_Today__c == Date.newInstance(Date.Today().year(), 8, 1)){ oppLineItem.Trigger_Update__c = TRUE; oppLineItemsToUpdate.add(oppLineItem); } else if (oppLineItem.Date_Today__c == Date.newInstance(Date.Today().year(), 11, 1)){ oppLineItem.Trigger_Update__c = TRUE; oppLineItemsToUpdate.add(oppLineItem); } else if (oppLineItem.Date_Today__c == Date.newInstance(Date.Today().year(), 2, 1)){ oppLineItem.Trigger_Update__c = TRUE; oppLineItemsToUpdate.add(oppLineItem); } } update oppLineItemsToUpdate; } global void finish(Database.BatchableContext bc){ System.debug(recordsProcessed + ' records processed.'); AsyncApexJob job = [SELECT Id, Status, NumberOfErrors, JobItemsProcessed, TotalJobItems, CreatedBy.Email FROM AsyncApexJob WHERE Id = :bc.getJobId()]; // call some utility to send email //EmailUtils.sendMessage(a, recordsProcessed); } }
//SCHEDULABLE CLASS global class ScheduleOpportunityLineItemUpdate implements Schedulable { global void execute(SchedulableContext sc){ UpdateOpportunityLineItems uol = new UpdateOpportunityLineItems(); database.executebatch(uol,1); } }
//TRIGGER trigger SetProductQuarter on OpportunityLineItem (before insert, before update) { for(OpportunityLineItem opitem : Trigger.new) { if(opitem.Product_Quarter_Number__c == 1) { if(opitem.Date_Today__c.Month() < 5) { if(opitem.ServiceDate.Year() == opitem.Date_Today__c.Year()) { opitem.Product_Quarter__c = 'Q1'; } else if(opitem.ServiceDate.Year() == opitem.Date_Today__c.Year() - 1) { opitem.Product_Quarter__c = 'P1'; } else { opitem.Product_Quarter__c = '='; } } else { if(opitem.Date_Today__c.Month() > 4) { if(opitem.Date_Today__c.Month() > 7) { if(opitem.ServiceDate.Year() == opitem.Date_Today__c.Year() + 1) { opitem.Product_Quarter__c = 'Q1'; } else if(opitem.ServiceDate.Year() == opitem.Date_Today__c.Year()) { opitem.Product_Quarter__c = 'P1'; } else { opitem.Product_Quarter__c = '='; } } else if(opitem.ServiceDate.Year() == opitem.Date_Today__c.Year()) { opitem.Product_Quarter__c = 'Q1'; } else { opitem.Product_Quarter__c = '='; } } else { opitem.Product_Quarter__c = '='; } } } else if(opitem.Product_Quarter_Number__c == 2) { if(opitem.ServiceDate.Year() == opitem.Date_Today__c.Year()) { if(opitem.Date_Today__c.Month() < 11) { opitem.Product_Quarter__c = 'Q2'; } else { opitem.Product_Quarter__c = 'P2'; } } else if(opitem.ServiceDate.Year() == opitem.Date_Today__c.Year() + 1) { if(opitem.Date_Today__c.Month() > 10) { opitem.Product_Quarter__c = 'Q2'; } else { opitem.Product_Quarter__c = '='; } } else if(opitem.ServiceDate.Year() == opitem.Date_Today__c.Year() - 1) { if(opitem.Date_Today__c.Month() < 11) { opitem.Product_Quarter__c = 'P2'; } else { opitem.Product_Quarter__c = '='; } } else { opitem.Product_Quarter__c = '='; } } else if(opitem.Product_Quarter_Number__c == 3) { if(opitem.Current_Quarter__c > 3) { if(opitem.ServiceDate.Year() == opitem.Date_Today__c.Year()) { if(opitem.ServiceDate.Month() >= 11) { opitem.Product_Quarter__c = 'Q3'; } else if(opitem.ServiceDate.Month() < 5) { opitem.Product_Quarter__c = 'P3'; } else { opitem.Product_Quarter__c = '='; } } else if(opitem.ServiceDate.Year() == opitem.Date_Today__c.Year() - 1) { if(opitem.ServiceDate.Month() >=11) { opitem.Product_Quarter__c = 'P3'; } else { opitem.Product_Quarter__c = '='; } } else { opitem.Product_Quarter__c = '='; } } else if(opitem.Current_Quarter__c < 3) { if(opitem.ServiceDate.Year() == opitem.Date_Today__c.Year()) { if((opitem.ServiceDate.Month() < 2 && opitem.Date_Today__c.Month() < 2)) { opitem.Product_Quarter__c = 'Q3'; } else if(opitem.ServiceDate.Month() < 2 && opitem.Date_Today__c.Month() > 1) { opitem.Product_Quarter__c = 'P3'; } else { opitem.Product_Quarter__c = '='; } } else if(opitem.ServiceDate.Year() == opitem.Date_Today__c.Year()+1) { if(opitem.ServiceDate.Month() < 2) { opitem.Product_Quarter__c = 'Q3'; } else { opitem.Product_Quarter__c = '='; } } else if(opitem.ServiceDate.Year() == opitem.Date_Today__c.Year()-1) { if(opitem.ServiceDate.Month() > 10) { opitem.Product_Quarter__c = 'P3'; } else { opitem.Product_Quarter__c = '='; } } else { opitem.Product_Quarter__c = '='; } } else if(opitem.Current_Quarter__c == 3) { if(opitem.ServiceDate.Year() == opitem.Date_Today__c.Year()) { if(opitem.ServiceDate.Month() > 10) { if(opitem.Date_Today__c.Month() > 10) { opitem.Product_Quarter__c = 'Q3'; } else { opitem.Product_Quarter__c = '='; } } else if(opitem.ServiceDate.Month() < 2) { if(opitem.Date_Today__c.Month() < 2) { opitem.Product_Quarter__c = 'Q3'; } else { opitem.Product_Quarter__c = 'P3'; } } else { opitem.Product_Quarter__c = '='; } } else if(opitem.ServiceDate.Year() == opitem.Date_Today__c.Year() + 1) { if(opitem.ServiceDate.Month() < 2) { opitem.Product_Quarter__c = 'Q3'; } else { opitem.Product_Quarter__c = '='; } } else if(opitem.ServiceDate.Year() == opitem.Date_Today__c.Year() - 1) { if(opitem.ServiceDate.Month() > 10) { if(opitem.Date_Today__c.Month() < 2) { opitem.Product_Quarter__c = 'Q3'; } else { opitem.Product_Quarter__c = 'P3'; } } else if(opitem.ServiceDate.Month() < 2) { if(opitem.Date_Today__c.Month() < 2) { opitem.Product_Quarter__c = 'P3'; } else { opitem.Product_Quarter__c = '='; } } else { opitem.Product_Quarter__c = '='; } } else { opitem.Product_Quarter__c = '='; } } } else if(opitem.Product_Quarter_Number__c == 4) { if(opitem.ServiceDate.Year()== opitem.Date_Today__c.Year()) { if(opitem.ServiceDate.Month() < 5) { if(opitem.Date_Today__c.Month() < 5) { opitem.Product_Quarter__c = 'Q4'; } else { opitem.Product_Quarter__c = '='; } } else { opitem.Product_Quarter__c = '='; } } else if(opitem.ServiceDate.Year() == opitem.Date_Today__c.Year() + 1) { if(opitem.Date_Today__c.Month() < 5) { opitem.Product_Quarter__c = '='; } else { opitem.Product_Quarter__c = 'Q4'; } } else if(opitem.ServiceDate.Year() - opitem.Date_Today__c.Year() > 1) { opitem.Product_Quarter__c = '='; } else { opitem.Product_Quarter__c = '='; } } } }
I have tried chnaging the batch size (hence why it is currently 1) in case I was hitting any limits but that didnt seem to help. Any ideas?
Thanks,
Ben