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
Hermann OuréHermann Ouré 

Trigger to update Date/time custom field

Hello,

I have created a trigger to update a custom date/time field (called First_Aircall_Logged__c).
Basically when a (aircall) task is created on a Case. The trigger should update the field First_Aircall_Logged__c with the task CreatedDate. 
But by trigger is not working.
A actually have an error 
System.ListException: List index out of bounds: 0
Trigger.AircallTaskTrigger: line 17, column 1: []

17: c.First_Aircall_Logged__c = c.tasks[0].CreatedDate;

How can I fix the trigger
Thank you
trigger AircallTaskTrigger on Task (after insert, after update) {
   
    Set<Id> caseIds = new Set<Id>();
   
    for(Task t: Trigger.New) {
        caseIds.add(t.WhatId);
    }
   
	//List<Case> toBeUpdateCase = [SELECT Id, First_Aircall_Logged__c, (SELECT Id, CreatedDate FROM Tasks) FROM Case WHERE Id IN: caseIds];
    Map<Id, Case> caseAircallTask = new Map<Id, Case> ([SELECT Id, First_Aircall_Logged__c, (SELECT Id FROM Tasks WHERE CallDisposition LIKE '%aircall%') 
                                                        FROM Case WHERE Id IN: caseIds]);
   
    if(caseAircallTask.size() > 0) { 
        for(Case c :caseAircallTask.values()) {
       
            System.debug('Cases with Aircall Task ' + caseAircallTask);
            c.First_Aircall_Logged__c = c.tasks[0].CreatedDate;
   	 	 }
    }
   
    update caseAircallTask.values();
}

 
Abhishek BansalAbhishek Bansal
Hi ,

Please find the updated code below:
trigger AircallTaskTrigger on Task (after insert, after update) {
   
    Set<Id> caseIds = new Set<Id>();
   
    for(Task t: Trigger.New) {
        caseIds.add(t.WhatId);
    }
   
	//List<Case> toBeUpdateCase = [SELECT Id, First_Aircall_Logged__c, (SELECT Id, CreatedDate FROM Tasks) FROM Case WHERE Id IN: caseIds];
    Map<Id, Case> caseAircallTask = new Map<Id, Case> ([SELECT Id, First_Aircall_Logged__c, (SELECT Id FROM Tasks WHERE CallDisposition LIKE '%aircall%') 
                                                        FROM Case WHERE Id IN: caseIds]);
   
    if(caseAircallTask.size() > 0) { 
        for(Case c :caseAircallTask.values()) {
            System.debug('Cases with Aircall Task ' + caseAircallTask);
			for(Task tsk : c.tasks) {
				c.First_Aircall_Logged__c = tsk.CreatedDate;
			}
   	 	 }
    }
   
    update caseAircallTask.values();
}

Let me know if you need any other help.

Thanks,
Abhishek Bansal.
Maharajan CMaharajan C
Hi  Hermann,

Just you have to perform the empty before the line 17. No need for multiple for loops. Before update case record also do the null check. 
 
trigger AircallTaskTrigger on Task (after insert, after update) {
   
    Set<Id> caseIds = new Set<Id>();
   
    for(Task t: Trigger.New) {
        caseIds.add(t.WhatId);
    }
   
	//List<Case> toBeUpdateCase = [SELECT Id, First_Aircall_Logged__c, (SELECT Id, CreatedDate FROM Tasks) FROM Case WHERE Id IN: caseIds];
    Map<Id, Case> caseAircallTask = new Map<Id, Case> ([SELECT Id, First_Aircall_Logged__c, (SELECT Id FROM Tasks WHERE CallDisposition LIKE '%aircall%') 
                                                        FROM Case WHERE Id IN: caseIds]);
   
    if(caseAircallTask.size() > 0) { 
        for(Case c :caseAircallTask.values()) {
       
            System.debug('Cases with Aircall Task ' + caseAircallTask);
			if(c.Tasks.size() > 0)
				c.First_Aircall_Logged__c = c.tasks[0].CreatedDate;
   	 	 }
    }
   
	if(!caseAircallTask.IsEmpty())
    update caseAircallTask.values();
}

Thanks,
Maharajan.C
Hermann OuréHermann Ouré
Hello to both of you,
Thank you for your answers but at the end I found the answer to my question.
here is what I have done. The code is working fine but in term of code efficiency maybe my code can be optimized.
If you have any suggestion to optimise my code please share.
trigger AircallTaskTrigger on Task (after insert, after update) {
   
    //First part of the code: How to query to match WhatId to CaseId
    Set<Id> caseIds = new Set<Id>();
    
    Map<Id, Task> aircallTask = new Map<Id, Task>([SELECT Id, WhatId FROM Task WHERE CallDisposition LIKE '%aircall%' AND Id IN: Trigger.New]);
                                                       
    for(Task t: aircallTask.values()) { 
        System.debug('##### Aircall Task ' + aircallTask);
        if(t.WhatId != null ) caseIds.add(t.WhatId);
        
    }
   
    Map<Id, Case> caseWithAircallTask = new Map<Id, Case> ([SELECT Id, First_Aircall_Logged__c, (SELECT Id, CreatedDate FROM Tasks) FROM Case WHERE Id IN: caseIds]); 
      
    if(caseWithAircallTask.size() > 0) { 
        for(Case c :caseWithAircallTask.values()) {
            System.debug('Cases with Aircall Task ' + caseWithAircallTask);
           
             c.First_Aircall_Logged__c = c.tasks[0].CreatedDate;
           
   	 	 }
    }
   
    update caseWithAircallTask.values();
}

 
Abhishek BansalAbhishek Bansal
Hi Herman,

You can use the below trigger code:
trigger AircallTaskTrigger on Task (after insert, after update) {
	String casePrefix = Case.sobjecttype.getDescribe().getKeyPrefix();
	Set<Id> caseIds = new Set<Id>();
	for(Task newTask : trigger.new) {
		if(newTask.WhatId != null && String.valueOf(newTask.WhatId).startsWith(casePrefix)) {
			caseIds.add(newTask.WhatId);
		}
	}
	if(caseIds.size() > 0) {
		List<Case> caseToUpdate = new List<Case>();
		for(Case existingCase : [SELECT Id, First_Aircall_Logged__c, (SELECT Id, CreatedDate FROM Tasks) FROM Case WHERE Id IN: caseIds]) {
			if(existingCase.Tasks != null) {
				existingCase.First_Aircall_Logged__c = existingCase.tasks[0].CreatedDate;
				caseToUpdate.add(existingCase);
			}
		}
		if(caseToUpdate.size() > 0) {
			update caseToUpdate;
		}
	}
}
Note: Since you are using the CreatedDate which can not be changed so I am not sure why you are using after update in your trigger. You can remove that as well.

Thanks,
Abhishek Bansal.