You need to sign in to do that
Don't have an account?
er.rajhanschaubey
Apex Cpu Limit Exceeded. How to use my class as a batch to avoid this issue.
public with sharing class updateAssetController {
private list<ASSETS__c> asset;
private list<AUDIT__c> audit;
private list<AggregateResult> aggResult;
private Integer Total;
private String str;
private list<answerData> answer;
private map<String,list<answerData>> ansData ;
private map<String,Map<String,list<answerData>>> containsAllData ;
private Integer Totalcount=0;
private list<answerData> filAns;
public updateAssetController(){
}
public void allRecord(){
asset = [Select id,name from ASSETS__c];
list<String> nameList = new list<String>{'MAKE__c','COUNTRY__c'} ;
ansData = new Map<String,List<answerData>>();
for(String fieldName :nameList){
String query = 'SELECT count(Id) myCount,'+fieldName+',ASSETS__c ';
query+= ' FROM AUDIT__c GROUP BY '+fieldName+',ASSETS__c';
aggResult = Database.query(query);
for(AggregateResult ar:aggResult){
String question;
Total = (Integer)ar.get('myCount');
str = (String)ar.get(fieldName);
question = fieldName.replaceAll('__c','');
if(!ansData.containsKey(question)){
answer =new List<answerData>();
answer.add(new answerData(Total,str,(String)ar.get('ASSETS__c')));
ansData.put((question),answer);
}
else{
list<answerData> existingvalue = ansData.get((question));
existingvalue.add(new answerData(Total,str,(String)ar.get('ASSETS__c')));
}
}
}
containsAllData = new Map<String,Map<String,List<answerData>>>();
for(ASSETS__c au :asset){
map<String,list<answerData>> filterData = new map<String,list<answerData>>();
for (String s : ansData.keySet()){
list<answerData> filAns =new list<answerData>();
for(answerData anData : ansData.get(s)){
if(anData.Auid == au.id){
filAns.add(new answerData(anData.a,anData.result,anData.Auid));
filterData.put(s,filAns);
}
}
}
containsAllData.put(au.id,filterData);
}
Set<ASSETS__c> allAsset = new Set<ASSETS__c>();
map<String,List<answerData>> relatedRecord = new map<String,list<answerdata>>();
for (String str : containsAllData.keySet()){
ASSETS__c a = new ASSETS__c(id=str);
relatedRecord = containsAllData.get(str);
for(String assign: relatedRecord.keyset()){
if(Assign=='MAKE'){
Integer firstInt =0;
Integer second =0;
String firstValue;
String secondValue;
Totalcount=0;
for(answerData st:relatedRecord.get(assign)){
Totalcount +=st.a;
if(firstInt == 0|| firstInt<st.a){
if(st.result != null && st.a> firstInt){
firstInt = st.a;
firstValue = st.result;
}else if(st.result == null && st.a> firstInt){
second =st.a;
secondValue =st.result;
}
}
}
if(firstInt > 1){
a.MAKE__c = firstValue;
}
else{
a.MAKE__c = secondValue;
}
}
else if(Assign=='COUNTRY'){
Integer firstInt =0;
Integer second =0;
String firstValue;
String secondValue;
Totalcount=0;
for(answerData st:relatedRecord.get(assign)){
Totalcount +=st.a;
if(firstInt == 0|| firstInt<st.a){
if(st.result != null && st.a> firstInt){
firstInt = st.a;
firstValue = st.result;
}else if(st.result == null && st.a> firstInt){
second =st.a;
secondValue =st.result;
}
}
}
if(firstInt > 1){
a.COUNTRY__c = firstValue;
}
else{
a.COUNTRY__c = secondValue;
}
}
}
allAsset.add(a);
}
list<ASSETS__c> assetRecord =new list<ASSETS__c>();
assetRecord.addALL(allAsset);
update assetRecord;
}
public class answerData {
public Integer a;
public String Result;
private String Auid;
public answerData(Integer a, String Result,String AssetId) {
this.a =a;
this.Result=Result;
auid = AssetId;
}
}
}
private list<ASSETS__c> asset;
private list<AUDIT__c> audit;
private list<AggregateResult> aggResult;
private Integer Total;
private String str;
private list<answerData> answer;
private map<String,list<answerData>> ansData ;
private map<String,Map<String,list<answerData>>> containsAllData ;
private Integer Totalcount=0;
private list<answerData> filAns;
public updateAssetController(){
}
public void allRecord(){
asset = [Select id,name from ASSETS__c];
list<String> nameList = new list<String>{'MAKE__c','COUNTRY__c'} ;
ansData = new Map<String,List<answerData>>();
for(String fieldName :nameList){
String query = 'SELECT count(Id) myCount,'+fieldName+',ASSETS__c ';
query+= ' FROM AUDIT__c GROUP BY '+fieldName+',ASSETS__c';
aggResult = Database.query(query);
for(AggregateResult ar:aggResult){
String question;
Total = (Integer)ar.get('myCount');
str = (String)ar.get(fieldName);
question = fieldName.replaceAll('__c','');
if(!ansData.containsKey(question)){
answer =new List<answerData>();
answer.add(new answerData(Total,str,(String)ar.get('ASSETS__c')));
ansData.put((question),answer);
}
else{
list<answerData> existingvalue = ansData.get((question));
existingvalue.add(new answerData(Total,str,(String)ar.get('ASSETS__c')));
}
}
}
containsAllData = new Map<String,Map<String,List<answerData>>>();
for(ASSETS__c au :asset){
map<String,list<answerData>> filterData = new map<String,list<answerData>>();
for (String s : ansData.keySet()){
list<answerData> filAns =new list<answerData>();
for(answerData anData : ansData.get(s)){
if(anData.Auid == au.id){
filAns.add(new answerData(anData.a,anData.result,anData.Auid));
filterData.put(s,filAns);
}
}
}
containsAllData.put(au.id,filterData);
}
Set<ASSETS__c> allAsset = new Set<ASSETS__c>();
map<String,List<answerData>> relatedRecord = new map<String,list<answerdata>>();
for (String str : containsAllData.keySet()){
ASSETS__c a = new ASSETS__c(id=str);
relatedRecord = containsAllData.get(str);
for(String assign: relatedRecord.keyset()){
if(Assign=='MAKE'){
Integer firstInt =0;
Integer second =0;
String firstValue;
String secondValue;
Totalcount=0;
for(answerData st:relatedRecord.get(assign)){
Totalcount +=st.a;
if(firstInt == 0|| firstInt<st.a){
if(st.result != null && st.a> firstInt){
firstInt = st.a;
firstValue = st.result;
}else if(st.result == null && st.a> firstInt){
second =st.a;
secondValue =st.result;
}
}
}
if(firstInt > 1){
a.MAKE__c = firstValue;
}
else{
a.MAKE__c = secondValue;
}
}
else if(Assign=='COUNTRY'){
Integer firstInt =0;
Integer second =0;
String firstValue;
String secondValue;
Totalcount=0;
for(answerData st:relatedRecord.get(assign)){
Totalcount +=st.a;
if(firstInt == 0|| firstInt<st.a){
if(st.result != null && st.a> firstInt){
firstInt = st.a;
firstValue = st.result;
}else if(st.result == null && st.a> firstInt){
second =st.a;
secondValue =st.result;
}
}
}
if(firstInt > 1){
a.COUNTRY__c = firstValue;
}
else{
a.COUNTRY__c = secondValue;
}
}
}
allAsset.add(a);
}
list<ASSETS__c> assetRecord =new list<ASSETS__c>();
assetRecord.addALL(allAsset);
update assetRecord;
}
public class answerData {
public Integer a;
public String Result;
private String Auid;
public answerData(Integer a, String Result,String AssetId) {
this.a =a;
this.Result=Result;
auid = AssetId;
}
}
}
Since your coding contains SOQL query within the for loop. This type of codes takes too much of time to process your records.
CPU Limits are,
Synchronous --> 10,000ms
Asynchronous --> 60,000ms
Please follow the below link for coding standards and write your query outside for loop.
https://developer.salesforce.com/page/Apex_Code_Best_Practices
Especially in this case where you have a SOQL query in a loop!
http://www.sfdc99.com/beginner-tutorials/#governorLimits
Basically, you need to use Maps =)