0

I have 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 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 update 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;
         }
     }
Dvyn Resh
  • 980
  • 1
  • 6
  • 14
Amit
  • 71
  • 3
  • 15

1 Answers1

0

You should query the system first to see if one exists. If it does, then update it, if it does not then create one.

trigger TrackTask2 on Task (before insert) {
    Set<Id> users = new Set<Id>();
    for (Task t : Trigger.new) {
        users.add(t.ownerId); //might be t.whoId;
    }
    List<sujya__Task_Tracking__c> existingTrackers = [SELECT Id, sujya__User__c, number_open_task__c, number_closed_task__c FROM sujya__Task_Tracking__c WHERE sujya__User__c IN :users];
    Map<Id, sujya__Task_Tracking__c> userTrackerMap = new Map<Id, sujya__Task_Tracking__c>();
    for (sujya__Task_Tracking__c tracker : existingTrackers) {
        userTrackerMap.put(tracker.sujya__User__c, tracker);
    }

    for (Task t : Trigger.new) {
        sujya__Task_Tracking__c userTracker = existingTrackers.get(t.ownerId);
        if (userTracker == null) { 
            userTracker = new sujya__Task_Tracking__c(); 
            userTracker.number_open_task__c = 1;
            userTracker.sujya__User__c = t.ownerId;
        } else {
            userTracker.number_open_task__c += 1;
        }
        userTrackerMap.put(userTracker.sujya__User__c, userTracker);
    }

    upsert userTrackerMap.getValues();
}

This will get you most of the way, but you're going to have to add logic for when a task is closed to decrement the number of open tasks and the number of close tasks.

And please follow trigger best practices by using a handler class

TemporaryFix
  • 2,008
  • 3
  • 30
  • 54