You need to sign in to do that
Don't have an account?

batch failing to update all the records with proper data
HI all ,
Serious PROD issue. Can any one provide solution ...
Below Batch class which update Fact_Revenue__C in Opportunity from Revenue__c object . it runs daily basis
Issue: many records are not populating correct values into Fact_Revenue__C .
Suppose : Sum(ttlRmrev__C) = $ 100 same has to populate in Fact_Revenue__C in opportunity but for many records it is failing .. updaing less than the correct value.
Serious PROD issue. Can any one provide solution ...
Below Batch class which update Fact_Revenue__C in Opportunity from Revenue__c object . it runs daily basis
Issue: many records are not populating correct values into Fact_Revenue__C .
Suppose : Sum(ttlRmrev__C) = $ 100 same has to populate in Fact_Revenue__C in opportunity but for many records it is failing .. updaing less than the correct value.
global without sharing class batchrevenue implements Database.Batchable<sObject>{ public String strQuery =''; public DateTime dtProvided ; AggregateResult[] tlrevenue ; set<id> sopids; global batchableSumGroupBookingCodeRevenue(Date sldte){ if(sldte == null){ sldte = date.today().addDays(-20); } dtProvided = DateTime.newInstance(sldte.year(),sldte.month(),sldte.day(),0,0,0); if(test.isRunningTest()){ strQuery = 'Select Id From Opportunity where glc_Code__C != null limit 2'; } else { strQuery = 'Select Id From Opportunity where glc_Code__C != null '; } sopids= new Set<Id>(); } global Database.QueryLocator start(Database.BatchableContext BC) { system.debug('==========::strQuery::==========='+strQuery); return Database.getQueryLocator(strQuery); } global void execute(Database.BatchableContext BC, List<Opportunity> scopeOpty) { if(sopids != null){ sopids= new Set<Id>(); } for(Opportunity opty: scopeOpty) { system.debug('xxxx::opty::===========>'+opty); sopids.add(opty.Id); } tlrrmrev(sopids); } public void tlrrmrev( set<id> sopids ){ try{ list<Opportunity> selOpportunity = new list<Opportunity>(); tlrevenue =[select SUM(ttlRmrev__C) totalRevenue, Opportunity__c Opportunity From Revenue__c where Opportunity__c in : sopids GROUP BY Opportunity__c]; for(AggregateResult agreeResult : tlrevenue){ system.debug('xxxx:agreeResult.get(Opportunity)::===========>'+agreeResult.get('Opportunity')); if(agreeResult.get('Opportunity') != null){ selOpportunity.add(new Opportunity(id = (string) agreeResult.get('Opportunity'), Fact_Revenue__C = (decimal) agreeResult.get('totalRevenue'))); } } if(selOpportunity.size() > 0){ system.debug('xxxx::selOpportunity::===========>'+selOpportunity); update selOpportunity; } } catch(exception ex){ System.debug('Exception is :::' + ex.getMessage()); } // } }
Do you have some examples of the different values? 0 instead of 100, 50 instead of 100
1) Your query locator is: Select Id From Opportunity where glc_Code__C != null
All the opportunities with glc_Code__C == null are ignored (out of scope).
2) The governor limits for the AggregateResult if the scope of your query locator is very high but you should have an error.
Queries that include aggregate functions are subject to the same governor limits as other SOQL queries for the total number of records returned. This limit includes any records included in the aggregation, not just the number of rows returned by the query. If you encounter this limit, you should add a condition to the WHERE clause to reduce the amount of records processed by the query.
https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/langCon_apex_SOQL_agg_fns.htm
3) The null values: the sum of null values is null if all the values of the calculation are null (in the past, the sum was null is only one value was null).
Regards
From your list of raised points
1. is required logic
3. is fine
2. i am not clear what you are trying to explain .... but soql returend records definetly not exceeding govern limits... hardly it will retrive very few revenue records for opportunity.
if you think to put where in the case .. can you share idea on this.
Are there many wrong results for opportunities when their last modified dates are in the past days with glc_Code__C != null ?
You have probably already check the last modified dates of the opportunities in detail (after the end of the batch).
Alain
Batch is succesfully updating the record whern glc_Code__C != null but not with correct value...
I can see lastmodified date changed every day after batch job completion (monitored it for couple of days).. but it was failing to update correct values.
As I fear the same problem one day for myself, I am interested by the solution (I don't have it)
Another possibility is the change of values of glc_Code__C after the batch ended.
So you need a trigger if this value glc_Code__C changes
Without a trigger on the updates of glc_Code__C, the stored sum could be false.
Regards.
i wnat to log all the batch jobs .. How can i save debug logs from batch job to catch eroor which is causing fail to update records throug batch job ??