2

I want to update existing task records but a new record gets created instead . What am I doing wrong.

Apex:

public static void Activities(List<Account> accounts) {
  Set<Id> persAccIds = (new Map<Id, Account> (accounts)).keySet();

  set<id> TaskWhatIDs = new set<id> ();
  for (Task t :[Select WhatId from Task where Subject = 'Sending' and Status != 'Completed' and whatId IN :persAccIds]) {
    TaskWhatIDs.add(t.whatId);
  }
      System.debug('persAccIds: ' + persAccIds);
              System.debug('soql: ' + [select id, PersonEmail, FirstName, LastName, SsoId__c, PersonContactId FROM Account WHERE id IN :persAccIds]);


  List<Task> taskList = [Select id FROM Task where id IN :TaskWhatIDs];
  for (Account acc : [select id, PersonEmail, FirstName, LastName, SsoId__c, PersonContactId FROM Account WHERE id IN :persAccIds]) {
    //if (TaskWhatIDs.contains(acc.Id))
    //continue;
           System.debug('acc: ' + acc);

    Profile Obj = new Profile(acc);
    Task gTask = new Task();
    gTask.Status = 'Not Started';
    gTask.Description = System.JSON.serialize(Obj);
    gTask.WhoId = acc.PersonContactId;
    gTask.WhatId = acc.Id;
    gTask.Subject = 'Send';
    taskList.add(gTask);
  }

  if (taskList.size() > 0) {
      System.debug('taskList: ' + taskList);
    upsert taskList;
  }
}
  • 1
    You're not binding an ID with the new instance of Task which you're creating in for loop. Something like this: gTask.id = task.id; – Rohit Mourya Jan 23 at 7:45
  • Are you trying to update accounts's tasklist? – rahul gawale Jan 23 at 7:52
  • @rahulgawale That is what I want to achieve indeed. – Thomas Jan 23 at 7:57
1

You don't need to have two queries on Task object, rather you can get them in a single query on account object.

Account[] accounts = [SELECT id, (SELECT WhatId FROM Tasks where Subject = 'Sending' and Status != 'Completed') FROM Account WHERE Id IN :accounts];
Task[] taskList = new List<Task>();
for (Account acc : accounts){
    for(Task taskObj: acc.Tasks){
        /// Update the fields here
    }
    taskList.addAll(acc.Tasks);
}
//...
update taskList;
| improve this answer | |
1

I suggest this sort of code if there is only ever one Task at most per Account:

Map<Id, Task> whatIdToTasks = Map<Id, Task>();
for (Task t : [...]) {
    whatIdToTasks.put(t.whatId, t);
}

for (Account acc : [...]) {
    // Update existing Task or create new one
    Task gTask = whatIdToTasks.get(acc.Id);
    if (gTask == null) gTask = new Task(Id = acc.Id);
    ...
}
| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.