I have created a batch apex and I get this error: Batch Apex: Too many SOQL queries: 201
while I don't have any SOQL query in a for loop. I suspect it is coming from the DatedConversionRate query but I don't see the issue.
Does anyone can help on this ?
global class UpdateFxRateForOpenOpps implements
Database.Batchable<sObject>, Database.Stateful {
// instance member to retain state across transactions
global Integer recordsProcessed = 0;
global Database.QueryLocator start(Database.BatchableContext bc) {
return Database.getQueryLocator(
'SELECT ID, FX_EU__c, FX_Entity__c, CurrencyIsoCode, Entity__c FROM Opportunity ' +
'Where RecordType.Name IN (\'Renewals\', \'New Business\') AND isClosed=false'
);
}
global void execute(Database.BatchableContext bc, List<Opportunity> scope){
// process each batch of records
List<DatedConversionRate> fxRates = [SELECT ConversionRate,
IsoCode
FROM DatedConversionRate
WHERE StartDate=:System.today()];
List<Opportunity> opps = new List<Opportunity>();
for (Opportunity opp : scope) {
if (opp.CurrencyIsoCode == 'EUR') {
opp.FX_EU__c = 1;
} else {
opp.FX_EU__c = getRate(opp.CurrencyIsoCode, fxRates);
}
opps.add(opp);
}
update opps;
}
global void finish(Database.BatchableContext bc){
System.debug(recordsProcessed + ' records processed. Shazam!');
AsyncApexJob job = [SELECT Id, Status, NumberOfErrors,
JobItemsProcessed,
TotalJobItems, CreatedBy.Email
FROM AsyncApexJob
WHERE Id = :bc.getJobId()];
// call some utility to send email
//EmailUtils.sendMessage(job, recordsProcessed);
}
private Decimal getRate(String oppCurrency, List<DatedConversionRate> fxRates){
Decimal rate;
for (DatedConversionRate r: fxRates) {
if (r.IsoCode == oppCurrency) {
rate = r.ConversionRate;
}
}
return rate;
}
}