function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Huy NguyenHuy Nguyen 

governor limit

Hi all,

I have below code . Can I update anything to avoid governor limit ?



trigger PenaltyNoticeReviewTrigger on Penalty_Notice_Review__c (before insert) {
    try
    {
        if (Trigger.isInsert) {
            if(trigger.isBefore){
                for(Penalty_Notice_Review__c item :Trigger.New){
                    // get list of Penalty_Notice_Review__c
                    List<Penalty_Notice_Review__c> penaltyNotices = [SELECT Id,Name,Penalty_Notice__c,Review_Number__c FROM Penalty_Notice_Review__c where Penalty_Notice__c =: item.Penalty_Notice__c];
                    if(penaltyNotices.size()==0)
                        item.Review_Number__c = 1;
                    else
                        item.Review_Number__c = penaltyNotices.size() + 1;
                }
            }
        }
    }
    catch (Exception ex)
    {
        System.debug('Error Occurred:' + '[' + ex.getMessage() +' ]');
        throw new FADMSException(ex.getMessage());
    }
   
Best Answer chosen by Huy Nguyen
ra811.3921220580267847E12ra811.3921220580267847E12
Hi,

Take SOQL query outside for loop:
trigger PenaltyNoticeReviewTrigger on Penalty_Notice_Review__c (before insert) {
    try
    {
        if (Trigger.isInsert) {
            if(trigger.isBefore){
            set<ID> ids= new set<ID>();
                for(Penalty_Notice_Review__c item :Trigger.New){
                    // get list of Penalty_Notice_Review__c
                    ids.add(item.Penalty_Notice__c);
                    }
                    List<Penalty_Notice_Review__c> penaltyNotices = [SELECT Id,Name,Penalty_Notice__c,Review_Number__c FROM Penalty_Notice_Review__c where Penalty_Notice__c IN: IDS];
                   
for(Penalty_Notice_Review__c item1:trigger.new)
{
if(penaltyNotices.size()==0)
{
 item.Review_Number__c = 1;
}
else
{
item.Review_Number__c = penaltyNotices.size() + 1;
}
}

All Answers

KaranrajKaranraj
You should not use SOQL query inside the for loop. Try this code
 
trigger PenaltyNoticeReviewTrigger on Penalty_Notice_Review__c (before insert) {
    try
    {
        List<String> listPenaltyNotice = new List<string>();
        List<Penalty_Notice_Review__c> penaltyNotices =  new List<Penalty_Notice_Review__c>();
        Boolean flag;
        if (Trigger.isInsert) {
            if(trigger.isBefore){
                for(Penalty_Notice_Review__c item :Trigger.New){
                    listPenaltyNotice.add(item.Penalty_Notice__c);
                }
                penaltyNotices = [SELECT Id,Name,Penalty_Notice__c,Review_Number__c FROM Penalty_Notice_Review__c where Penalty_Notice__c IN: penaltyNotices];
                for(Penalty_Notice_Review__c item :Trigger.New){
                    flag = true;
                    for(Penalty_Notice_Review__c pnr:penaltyNotices){
                        if(pnr.Penalty_Notice__c == item.Penalty_Notice__c){
                            item.Review_Number__c = item.Review_Number__c + 1;
                            flag = false;
                        }
                    }
                    if(flag)
                      item.Review_Number__c = 1;
                }
            }
        }
    }
    catch (Exception ex)
    {
        System.debug('Error Occurred:' + '[' + ex.getMessage() +' ]');
        throw new FADMSException(ex.getMessage());
    }
}

Check this link for apex best practices to overcome the governor limits https://developer.salesforce.com/page/Apex_Code_Best_Practices
ra811.3921220580267847E12ra811.3921220580267847E12
Hi,

Take SOQL query outside for loop:
trigger PenaltyNoticeReviewTrigger on Penalty_Notice_Review__c (before insert) {
    try
    {
        if (Trigger.isInsert) {
            if(trigger.isBefore){
            set<ID> ids= new set<ID>();
                for(Penalty_Notice_Review__c item :Trigger.New){
                    // get list of Penalty_Notice_Review__c
                    ids.add(item.Penalty_Notice__c);
                    }
                    List<Penalty_Notice_Review__c> penaltyNotices = [SELECT Id,Name,Penalty_Notice__c,Review_Number__c FROM Penalty_Notice_Review__c where Penalty_Notice__c IN: IDS];
                   
for(Penalty_Notice_Review__c item1:trigger.new)
{
if(penaltyNotices.size()==0)
{
 item.Review_Number__c = 1;
}
else
{
item.Review_Number__c = penaltyNotices.size() + 1;
}
}
This was selected as the best answer