You need to sign in to do that
Don't have an account?
pla
Too many SOQL queries: 101
Hello,
I wrote a trigger and a test class. My own test class passed. However there's an error thrown out from the other test class which has nothing to do with my trigger. Why it happened like that? Below is the error message. Please advise.
System.LimitException: Too many SOQL queries: 101
Thanks
Paul
Triggers fire in random order. It could be that your trigger used 99 queries and the next used 2 causing this error.
I would look through and see where your using the most queries. Ensure all code is up to bulkified standards.
Also, might want to check to see if the test classes are using Test.StartTest / Test.StopTest methods to reset governor limits after the test data has been created.
Thanks for your reply.
Yes the other test class used Test.StartTest / Test.StopTest. So what does it mean to my case here?
Thanks
Paul
I would turn on debugging and see if you can determine what is querying over 100 times.
Would you post your new trigger? I'd like to just see if it is bulkified.
Here you go. Thanks for your help.
trigger
CaseClientTrigger onCase (beforeinsert, beforeupdate) {
String Clients;
// String CarrierId;
String GroupNo;
for(Case CaseUpdated:trigger.new){
if (CaseUpdated.AccountId != null){
// CarrierId = CaseUpdated.Carrier__c;
GroupNo = CaseUpdated.Group__c;
if((Trigger.ISINSERT) || (Trigger.ISUPDATE)){
Account accName = [select id, parentId, name, Type fromAccountwhereId =: CaseUpdated.AccountId];
// Clients = accName.Name;if (accName.Type == 'Client'){
Clients = accName.id;
}
if (accName.Type == 'Carrier'){
if (accName.parentId != null){
List<
Account> accName1 = [select id, parentId, name, Type fromAccountwhereId =: accName.parentId];
// Clients = accName1[0].Name;
Clients = accName1[0].id;
}
else{
Clients =
null;
}
}
if (accName.Type == 'Account'){
if (accName.parentId != null){
List<
Account> accName1 = [select id, parentId, name, Type fromAccountwhereId =: accName.parentId];
// Clients = accName1[0].Name; if (accName1[0].parentId != null){
List<
Account> accName2 = [select id, parentId, name, Type fromAccountwhereId =: accName1[0].parentId];
// Clients = Clients + '; ' + accName2[0].Name;
Clients = accName2[0].id;
}
else{
Clients =
null;
}
}
}
if (accName.Type == 'Group'){
if (accName.parentId != null){
List<
Account> accName1 = [select id, parentId, name, Type fromAccountwhereId =: accName.parentId];
// Clients = accName1[0].Name;if (accName1[0].parentId != null){
List<
Account> accName2 = [select id, parentId, name, Type fromAccountwhereId =: accName1[0].parentId];
// Clients = Clients + '; ' + accName2[0].Name;if (accName2[0].parentId != null){
List<
Account> accName3 = [select id, parentId, name, Type fromAccountwhereId =: accName2[0].parentId];
// Clients = Clients + '; ' + accName3[0].Name;
Clients = accName3[0].id;
}
else{
Clients =
null;
}
}
}
}
// Type = Group // System.debug('CaseClientTrigger/Client: ' + Clients);if (Clients != null){
CaseUpdated.Client__c = Clients;
}
else{
// List<Account> aName = [SELECT id, name, Type FROM Account WHERE Carrier_ID__c =: CarrierId and Type =: 'Client' and RecordTypeId =: '01230000000XhdNAAS' limit 1];
List<
Account> aName = [SELECT id, name, Type FROMAccountWHERE Group_Number__c =: GroupNo and Type =: 'Client'and RecordTypeId =: '01230000000XhdNAAS'limit1];
if(aName.size() > 0){
CaseUpdated.Client__c = aName[0].id;
}
else{
CaseUpdated.Client__c =
null;
}
}
}
// Trigger insert/update
}
// if accountId
}
// for structure
}
This trigger needs to be bulkified properly. Having the SOQL queries like this: "Account accName = [select id, parentId, name, Type fromAccountwhereId =: CaseUpdated.AccountId];" inside the for loop means it will query for each record being updated (up to 200). You need to get all of the queries outside of the loop as SFDC limits to 100 queries per execution context.
Please review bulkify principles and rework as needed. http://wiki.developerforce.com/page/Best_Practice%3A_Bulkify_Your_Code
please do not use SOQL in for loop.
or(Case CaseUpdated:trigger.new){
if (CaseUpdated.AccountId != null){
// CarrierId = CaseUpdated.Carrier__c;
GroupNo = CaseUpdated.Group__c;
if((Trigger.ISINSERT) || (Trigger.ISUPDATE)){
Account accName = [select id, parentId, name, Type fromAccountwhereId =: CaseUpdated.AccountId];
// Clients = accName.Name;if (accName.Type == 'Client'){
Clients = accName.id;
}
change the code like this
or(Case CaseUpdated:trigger.new){
if (CaseUpdated.AccountId != null){
// CarrierId = CaseUpdated.Carrier__c;
GroupNo = CaseUpdated.Group__c;
if((Trigger.ISINSERT) || (Trigger.ISUPDATE)){
// Add the CaseUpdated.AccountId to a set and use the set to soql
// eg: (set<ofCaseUpdated.AccountId>)
// Clients = accName.Name;if (accName.Type == 'Client'){
Clients = accName.id;
}
Account accName = [select id, parentId, name, Type fromAccountwhereId in : (set<ofCaseUpdated.AccountId>)];
please do bulkifi or you will hit governor limits which might cause these kind of issues.
Thanks
Raj