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
Sujit KSujit K 

Need a help with apex trigger problem solution

I created a custom object Task Tracking with 3 custom fields:
1) Lookup to user object.
2) Number of open task (number field) 
3) Number if closed task (number field)
When a task is created by user A with let's stay status is IN PROGRESS, I need to create record in Task Tracking object record with these details :
1) Lookup field = user A
2) Number of open task = 1 
3) Number of closed task = 0;
Now next time, when same user A creates another task, the new Task Tracking record shouldn't be created but it should only increment/decrement Number of task field.

I have tried this much. I was able to create Task Tracking record whenever a Task is created but It was creating new Task Tracking Object for every Task that I am creating
trigger TrackTask2 on Task (before insert) { 
List<sujya__Task_Tracking__c> li = new List<sujya__Task_Tracking__c>(); 
sujya__Task_Tracking__c s = new sujya__Task_Tracking__c();
if(Trigger.isBefore && Trigger.isInsert){
 for(Task t:Trigger.new)
{
 s.sujya__User__c = t.CreatedById;
 li.add(s); 
} 
insert li; 
}
 }
Appreiciate your help :) 
 
Sathish LoganathanSathish Loganathan
Hi Sujit,

As per the trigger which you implemented. That is the expected behaviour. 

Can you try something like this:

trigger TrackTask2 on Task (before insert) { 
List<sujya__Task_Tracking__c> li = new List<sujya__Task_Tracking__c>();

sujya__Task_Tracking__c s = new sujya__Task_Tracking__c();
Map<Id,Id> tracker = new Map<Id,Id>();
Map<Id,Integer> trackopen = new Map<Id,Integer>();

for(Task t:Trigger.new)
{
tracker.put(t.id,t.id);
}
List<sujya__Task_Tracking__c> lis = new List<sujya__Task_Tracking__c>([Select id,OpenTask,sujya__User__c,sujya__User__r.id from sujya__Task_Tracking__c where sujya__User__c  IN:tracker.keyset()]); 
if(lis.size() > 0){
for(sujya__Task_Tracking__c l:lis){
if(tracker.containskey(l.sujya__User__r.id))
trackopen.put(l.sujya__User__r.id,OpenTask);
}

}
if(Trigger.isBefore && Trigger.isInsert){
 for(Task t:Trigger.new)
{
if(trackopen.containskey(t.CreatedById) && trackopen.get(CreatedById) > 0){
for(sujya__Task_Tracking__c l:lis){
if(tracker.containskey(l.sujya__User__r.id) && t.CreatedById == l.sujya__User__c)
l.OpenTask = l.OpenTask + 1;
li.add(l); 
}
}
else{
s.sujya__User__c = t.CreatedById;
s.OpenTask = 1;
}
 
 li.add(s); 

Database.upsert(li); 
}
 }

Please delete the existing Records(sujya__Task_Tracking__c) that is realted to the user which you are going to enter the task, while testing, so that the trigger can work with the new logic.

Regards,
Sathish Loganathan
 
Ajay K DubediAjay K Dubedi
Hi Sujit,
You need to create an extra field in your object for external Id for upsert the record.
So, create a field User_Id__c as External Id and then follow this code and change according to your requirement.

Trigger:
 
trigger TaskTrigger on Task (before insert) {
    if(trigger.isBefore && trigger.isinsert) {
        TaskTrigger_handler.createRelatedTaskTracking(trigger.new);
    }
}


Handler Class:
 
public class TaskTrigger_handler {
    public static void createRelatedTaskTracking(List<Task> taskList) {
        try 
        {
            Set<Id> userIdSet = new Set<Id>();
            List<Task_Tracking__c> ttObj = new List<Task_Tracking__c>();
            List<Task_Tracking__c> ttObjNew = new List<Task_Tracking__c>();
            Map<Id, Task_Tracking__c> userIdVsTasktracking = new Map<Id, Task_Tracking__c>();
            for(Task t : taskList) {
                if(t.Status == 'IN PROGRESS') {
                    userIdSet.add(t.OwnerId);
                }
            }
            if(userIdSet.size() > 0) {
                ttObj = [SELECT Id, Number_of_open_task__c, Number_of_closed_task__c, User__c, OwnerId, User_Id__c FROM Task_Tracking__c WHERE User__c In : userIdSet];
            }
            if(ttObj.size() > 0) {
                for(Task_Tracking__c tt : ttObj) {
                    if(!userIdVsTasktracking.containsKey(tt.OwnerId)) {
                        userIdVsTasktracking.put(tt.OwnerId, tt);
                    }
                }
            }
            
            for(Task t : taskList) {
                if(t.Status == 'IN PROGRESS') {
                    if(ttObj.size() > 0) {
                        if(userIdVsTasktracking.containsKey(t.OwnerId)) {
                            userIdVsTasktracking.get(t.OwnerId).Number_of_open_task__c = userIdVsTasktracking.get(t.OwnerId).Number_of_open_task__c + 1;
                            //userIdVsTasktracking.get(t.OwnerId).Number_of_closed_task__c = serIdVsTasktracking.get(t.OwnerId).Number_of_closed_task__c;// Do what you want to do with this field.
                            ttObjNew.add(userIdVsTasktracking.get(t.OwnerId));
                        }
                    }
                    else {
                        Task_Tracking__c ttO = new Task_Tracking__c();
                        ttO.User_Id__c = String.valueOf(t.OwnerId); // External Id
                        ttO.User__c = t.OwnerId;
                        ttO.Number_of_open_task__c = 1;
                        ttO.Number_of_closed_task__c = 0;
                        ttObjNew.add(ttO);
                    }
                }
            }
            Schema.SObjectField f = Task_Tracking__c.Fields.User_Id__c;
            database.upsert(ttObjNew, f, false);
        }
        catch(Exception ex)
        {
            System.debug('Exception on Line Number ' + ex.getLineNumber() + ' Message ---- ' + ex.getMessage());
        }
    }
}

I hope you find the above solution helpful. If it does, please mark as Best Answer to help others too.
Thanks,
Ajay Dubedi
Arpit Gupta 62Arpit Gupta 62
this trigger very lenthy . so not understand this trigger.