5

I want to update list of list of account. I am getting list of accounts from many sources, now i want to update them.

list<list<sObject>> la=new list<list<sObject>>();
la.add(accountList1);
la.add(accountList2);
upsert la;

Its throwing an error, is there any way through which we can upsert list of list of accounts?

0

2 Answers 2

7

You should instead look at the addAll method, which would allow you to use just one List<Account>:

List<Account> allRecords = new List<Account>();
allRecords.addAll(accountList1);
allRecords.addAll(accountList2);
upsert allRecords;

If, for some reason, you really want to maintain separate lists, you will have to flatten the structure you have in your OP:

List<Account> allRecords = new List<Account>();
for (List<Account> accountList : listOfLists)
    allRecords.addAll(accountList);
upsert allRecords;
1
  • Yes Sure @Adrian Commented May 1, 2016 at 4:45
2

You can't do this. You can only DML on single records or lists. Instead, make a single list and use addAll:

Account[] records = new Account[0];
records.addAll(accountList1);
records.addAll(accountList2);
upsert records;

As a side note, you also can't upsert on a generic list of SObject, so you'll need to use the Account concrete type instead.

6
  • Well, you can upsert on a generic list, you just need to be more clever about it.
    – Adrian Larson
    Commented Apr 28, 2016 at 16:26
  • 1
    @AdrianLarson I've never been able to accomplish this or seen it done. How do you do this?
    – sfdcfox
    Commented Apr 28, 2016 at 16:29
  • I solved it here. The only caveat is that you can't do it if you want to do Database.upsert(List<SObject>, SObjectField, Boolean), because that throws a compile error instead of runtime.
    – Adrian Larson
    Commented Apr 28, 2016 at 16:30
  • 1
    @AdrianLarson You're still instantiating a concrete sobject collection, though. My point was that the original code as written would have crashed for a completely annoying reason. Still, that's a pretty nifty trick in a pinch.
    – sfdcfox
    Commented Apr 28, 2016 at 16:33
  • 1
    @AdrianLarson You're instantiating a List<SpecificSObjectType> by way of Type.forName, and boxing it inside a generic reference. It works because upsert tries to unbox the value to see if it's a concrete list type before throwing a runtime error. I just tried that out. The code as written by the OP used a generic list, which would compile but then fail with a runtime exception. Like I said though, it's nice to know that it's not a compile-time error, which lets us have some code reuse. In fact, I have a use for that in my current code base...
    – sfdcfox
    Commented Apr 28, 2016 at 16:46

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .