You need to sign in to do that
Don't have an account?
Edward Vazquez
System.LimitException: Apex CPU time limit exceeded???
Here is my class below:
global class scheduleLatestCampaigns implements Schedulable {
global void execute(SchedulableContext SC) {
//make a map of all accounts to their presentations
Map<Id, List<Campaign>> accountToCampaigns = new Map<Id, List<Campaign>>();
List<Campaign> cs = [SELECT Id, Account__c, Date_Time_of_Presentation_Schdeuled__c,Frequency__c,Meeting_Summary__c, Presenter__r.Name FROM Campaign WHERE Date_Time_of_Presentation_Schdeuled__c <= TODAY AND RecordType.Name = 'Presentation' ORDER BY Date_Time_of_Presentation_Schdeuled__c DESC];
for (Campaign c : cs) {
if (accountToCampaigns.containsKey(c.Account__c)) {
List<Campaign> currentList = accountToCampaigns.get(c.Account__c);
currentList.add(c);
accountToCampaigns.put(c.Account__c, currentList);
} else {
accountToCampaigns.put(c.Account__c, new List<Campaign> { c });
}
}
List<Account> updateAccts = new List<Account>();
//Find the latest campaign on the account that it is attached to and update the account
for (Account acct : [SELECT Id FROM Account WHERE Id IN :accountToCampaigns.keySet()]) {
//find all presentations that have already occured
List<Campaign> campaigns = new List<Campaign>();
Campaign latestCampaign=null;
if (accountToCampaigns.containsKey(acct.Id)) {
latestCampaign = accountToCampaigns.get(acct.Id)[0];
}
if (latestCampaign != null) {
acct.Frequency__c = latestCampaign.Frequency__c;
acct.Last_Presentation__c = date.newinstance(latestCampaign.Date_Time_of_Presentation_Schdeuled__c.year(),
latestCampaign.Date_Time_of_Presentation_Schdeuled__c.month(),
latestCampaign.Date_Time_of_Presentation_Schdeuled__c.day());
acct.Meeting_Summary__c = latestCampaign.Meeting_Summary__c;
acct.Presenter__c = latestCampaign.Presenter__r.Name;
updateAccts.add(acct);
}
}
update updateAccts;
}
}
The code is breaking within this loop:
List<Campaign> cs = [SELECT Id, Account__c, Date_Time_of_Presentation_Schdeuled__c,Frequency__c,Meeting_Summary__c, Presenter__r.Name FROM Campaign WHERE Date_Time_of_Presentation_Schdeuled__c <= TODAY AND RecordType.Name = 'Presentation' ORDER BY Date_Time_of_Presentation_Schdeuled__c DESC]
Any ideas on how to go about fixing this.
global class scheduleLatestCampaigns implements Schedulable {
global void execute(SchedulableContext SC) {
//make a map of all accounts to their presentations
Map<Id, List<Campaign>> accountToCampaigns = new Map<Id, List<Campaign>>();
List<Campaign> cs = [SELECT Id, Account__c, Date_Time_of_Presentation_Schdeuled__c,Frequency__c,Meeting_Summary__c, Presenter__r.Name FROM Campaign WHERE Date_Time_of_Presentation_Schdeuled__c <= TODAY AND RecordType.Name = 'Presentation' ORDER BY Date_Time_of_Presentation_Schdeuled__c DESC];
for (Campaign c : cs) {
if (accountToCampaigns.containsKey(c.Account__c)) {
List<Campaign> currentList = accountToCampaigns.get(c.Account__c);
currentList.add(c);
accountToCampaigns.put(c.Account__c, currentList);
} else {
accountToCampaigns.put(c.Account__c, new List<Campaign> { c });
}
}
List<Account> updateAccts = new List<Account>();
//Find the latest campaign on the account that it is attached to and update the account
for (Account acct : [SELECT Id FROM Account WHERE Id IN :accountToCampaigns.keySet()]) {
//find all presentations that have already occured
List<Campaign> campaigns = new List<Campaign>();
Campaign latestCampaign=null;
if (accountToCampaigns.containsKey(acct.Id)) {
latestCampaign = accountToCampaigns.get(acct.Id)[0];
}
if (latestCampaign != null) {
acct.Frequency__c = latestCampaign.Frequency__c;
acct.Last_Presentation__c = date.newinstance(latestCampaign.Date_Time_of_Presentation_Schdeuled__c.year(),
latestCampaign.Date_Time_of_Presentation_Schdeuled__c.month(),
latestCampaign.Date_Time_of_Presentation_Schdeuled__c.day());
acct.Meeting_Summary__c = latestCampaign.Meeting_Summary__c;
acct.Presenter__c = latestCampaign.Presenter__r.Name;
updateAccts.add(acct);
}
}
update updateAccts;
}
}
The code is breaking within this loop:
List<Campaign> cs = [SELECT Id, Account__c, Date_Time_of_Presentation_Schdeuled__c,Frequency__c,Meeting_Summary__c, Presenter__r.Name FROM Campaign WHERE Date_Time_of_Presentation_Schdeuled__c <= TODAY AND RecordType.Name = 'Presentation' ORDER BY Date_Time_of_Presentation_Schdeuled__c DESC]
Any ideas on how to go about fixing this.
You really need the ORDER BY? probably (otherwise you just use a query locator with its scope).
Date_Time_of_Presentation_Schdeuled__c is not indexed by default.
A new number unique field is the only option for an indexed field containing a "datetime" (milliseconds since 1970) ... because the field Date_Time_of_Presentation_Schdeuled__c itself cannot be unique (not allowed for this type of field, no checkbox) and without the help of the Salesforce support, we cannot create new indexes but a date time could be indexed (CreatedDate, SystemModstamp are indexed).
A field often used in queries could be automatically indexed "sometimes" by SF (?) so you need to see the query plan.
Query Plan Tool (How To & FAQ): https://help.salesforce.com/articleView?id=000199003&type=1
https://developer.salesforce.com/blogs/engineering/2013/09/collecting-selectivity-statistics-for-force-com-queries.html
Finally, you need a unique field of type Number wich will contain the values of Date_Time_of_Presentation_Schdeuled__c.getTime()
By default, Force.com formula fields don’t have indexes so you need an update of this indexed field each time the associated date time change. Two fields if you display/enter the value Date_Time_of_Presentation_Schdeuled__c on screen.
http://resources.docs.salesforce.com/rel1/doc/en-us/static/pdf/salesforce_query_search_optimization_developer_cheatsheet.pdf
That is the theory because the updates of this indexed field could be time consuming and you need to see the query plan.
Best regards
Alain