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
Developer.mikie.Apex.StudentDeveloper.mikie.Apex.Student 

Trigger for creating 'support review' tasks. How to prevent recursion?

Hi there,

I am (trying) to create a trigger which will create support review tasks for users. The support review tasks are created when checkboxes are set to true. These checkboxes are set to true via a timebased trigger. 


I was hoping to get some people with more experience than myself to look at my code and offer their tips. The main thing I am worried about it, is tasks being set multiple times. As the criteria will be 90day review = true, etc. Will my trigger create a task for all those set as true? Or will it only create the tasks as the checkboxes are set to true. 

any help or tips would be very much appreciated. Thank you so much for your time.

 

Schema.DescribeSObjectResult d = Task.sObjectType.getDescribe();
        Map<String,Schema.RecordTypeInfo> rtMapByName = d.getRecordTypeInfosByName();
        Schema.RecordTypeInfo recordType =  rtMapByName.get('Arrange Support Review');
        Id ArrangeRecId = recordType.getRecordTypeId();
        
        List<Task> TaskToInsert = new List<Task>();

    Set<Id> TaskaccountIds = new Set<Id>();
    for (Service__c Ser : trigger.new) {
    if(Ser.Start_of_Service__c != null){
        TaskaccountIds.add(Ser.Account__c);
}
}
 /*
    List<Account> Seraccounts = [SELECT Id, (SELECT Id from Service__c) FROM Account WHERE Id IN :TaskaccountIds ];
    Map<Id, List<Service__c>> SeraccountMap = new Map<Id, List<Service__c>>();
    for (Account acct : Seraccounts) {
        List<Service__c> Services = new List<Service__c>();
        for (Service__c S : acct.Services) {
            contacts.add(S);
        }
        SeraccountMap.put(acct.Id, Services );
    }*/

    
   for (Service__c Ser : trigger.new) {
If(Trigger.oldmap.get(ser.id).X160Days_Review__c != ser.X160Days_Review__c || Trigger.oldmap.get(ser.id).X180Days_Review__c != ser.X180Days_Review__c || Trigger.oldmap.get(ser.id).X270Days_Review__c != ser.X270Days_Review__c || Trigger.oldmap.get(ser.id).X30Days_Review__c != ser.X30Days_Review__c || Trigger.oldmap.get(ser.id).X320Days_Review__c != ser.X320Days_Review__c || Trigger.oldmap.get(ser.id).X60Days_Review__c != ser.X60Days_Review__c || Trigger.oldmap.get(ser.id).X90Days_Review__c != ser.X90Days_Review__c ){
if(Ser.Start_of_Service__c != null){

 Task task = new task ();
 Task.RecordTypeID = ArrangeRecId;
 task.WhatId = Ser.Account__c;
 Task.IsReminderSet = True;
 Task.ReminderDateTime = system.now();
 Task.Priority = 'Normal';
 Task.Type = 'Call';
 Task.Status = 'Not Started';


           //30 Day Review
          If(Trigger.oldmap.get(ser.id).X30Days_Review__c != ser.X30Days_Review__c && Ser.X30Days_Review__c == True){  
           task.ActivityDate = Ser.Start_of_Service__c.AddDays(35);
           task.Subject = 'Arrange Support Review30Days';
            }
            
           //60 Day Review
          else If(Trigger.oldmap.get(ser.id).X60Days_Review__c != ser.X60Days_Review__c && Ser.X60Days_Review__c == True){ 
           task.ActivityDate = Ser.Start_of_Service__c.AddDays(65);
           task.Subject = 'Arrange Support Review60Days';
            }
            //90 Day Review
            else If(Trigger.oldmap.get(ser.id).X90Days_Review__c != ser.X90Days_Review__c && Ser.X90Days_Review__c == True){ 
            task.ActivityDate = Ser.Start_of_Service__c.AddDays(95);
           task.Subject = 'Arrange Support Review90Days';
            }
            //160 Day Review
             else If(Trigger.oldmap.get(ser.id).X160Days_Review__c != ser.X160Days_Review__c && Ser.X160Days_Review__c == True){ 
            task.ActivityDate = Ser.Start_of_Service__c.AddDays(165);
           task.Subject = 'Arrange Support Review160Days';
            }
            //180 Day Review
             else If(Trigger.oldmap.get(ser.id).X180Days_Review__c != ser.X180Days_Review__c && Ser.X180Days_Review__c == True){ 
            task.ActivityDate = Ser.Start_of_Service__c.AddDays(185);
           task.Subject = 'Arrange Support Review180Days';
            }
             //270 Day Review
             else If(Trigger.oldmap.get(ser.id).X270Days_Review__c != ser.X270Days_Review__c && Ser.X270Days_Review__c == True){ 
            task.ActivityDate = Ser.Start_of_Service__c.AddDays(275);
           task.Subject = 'Arrange Support Review270Days';
            }
             //320 Day Review
             else If(Trigger.oldmap.get(ser.id).X320Days_Review__c != ser.X320Days_Review__c && Ser.X320Days_Review__c == True){ 
            task.ActivityDate = Ser.Start_of_Service__c.AddDays(325);
           task.Subject = 'Arrange Support Review320Days';
            }
           
     task.ActivityDate = date.today()+2;
     task.Subject = 'Call Prospective Client';
     

     taskToInsert.add(task);
    }//end Finance Only If
    
    }
    
   
   }//end for o
  
  
  
  
   try {
    insert taskToInsert;
   }
   catch (system.Dmlexception e) {
    system.debug (e);
   }
ShashankShashank (Salesforce Developers) 
Here's a way of avoiding recursion in a trigger: https://help.salesforce.com/apex/HTViewSolution?id=000133752&language=en_US