You need to sign in to do that
Don't have an account?
GMASJ
System.ListException: Duplicate id in list in Code
Hi,
I am getting error below error while creating a new contact it is not happening while updating the contact.
modify the code I have highted the code which is giving me the error.
Please suggest me how to remove duplicates
Thanks
Sudhir
I am getting error below error while creating a new contact it is not happening while updating the contact.
There were custom validation error(s) encountered while saving the affected record(s). The first validation error encountered was "Apex trigger ContactTrigger caused an unexpected exception, contact your administrator: ContactTrigger: execution of AfterUpdate caused by: System.ListException: Duplicate id in list: 001W000000amehmIAA: ()".Below is the code it is working perfect for updating the contact during creating a new contact i am getting duplicate list Please suggest me how to
modify the code I have highted the code which is giving me the error.
Please suggest me how to remove duplicates
Trigger ======== if (Trigger.isAfter) { if(trigger.isInsert){ ContactCertificateRollupHandlerNew1.ProcessInsert(Trigger.new); } else if(trigger.isUpdate) { ContactCertificateRollupHandlerNew1.ProcessInsert(Trigger.new); } Helper Class ============= public class ContactCertificateRollupHandlerNew1{ Public static Map<id,integer> NSEmap1; Public static Map<id,integer> NSEmap2; Public static Integer NSEint1 = 0; Public static Integer NSEint2 = 0; Public static List<account> NSE1_Update = new List<account>(); Public static List<account> NSE2_Update = new List<account>(); Public static map<id,account> NSE1_Update_Map = new map<id,account>(); Public static map<id,account> NSE2_Update_Map = new map<id,account>(); public static void ProcessInsert (List<Contact> newCntLst){ list<id> actidSet = new list<id>(); for(Contact cont : newCntLst){ actidSet.add(cont.AccountId); } ProcessUpdate(actidSet[0]); //GetLastAccounts(actidSet[0]); } public static void ProcessUpdate (Id AccountID){ GetLastAccounts(AccountID); } public static void GetLastAccounts (Id AccountID){ set<id> GetAllActID = new set<id>(); GetAllActID = AccountHierarchyUtil.ChildToParnet(AccountID); GetAllActID = AccountHierarchyUtil.ParnetToChild(AccountID); List<Account> LastAct = [SELECT Id, name FROM Account where id in :GetAllActID]; Account LastAccount = LastAct[LastAct.size() - 1]; System.debug('LastAccount ID ' + LastAccount.id); System.debug('LastAccount Name ' + LastAccount.name); accountRollupUpdate(LastAccount.id); } public static void accountRollupUpdate(Id PAccountID) { Id accountId = PAccountID; NSEmap1 = new Map<id,integer>(); NSEmap2 = new Map<id,integer>(); ChildToParnet(accountId); if(NSEmap1.size()>0){ For(Id i : NSEmap1.keyset()){ Account ains = new Account(); ains.id = i; system.debug('Account' + i); system.debug(NSEmap1.get(i)); ains.NSE_1_Status__c = NSEmap1.get(i); NSE1_Update.add(ains); } } if(NSEmap2.size()>0){ For(Id i : NSEmap2.keyset()){ Account ains = new Account(); ains.id = i; system.debug('Account' + i); system.debug(NSEmap2.get(i)); ains.NSE_2_Status__c = NSEmap2.get(i); NSE2_Update.add(ains); } } if(NSE1_Update.size()>0) //These are line where the i am getting duplicate error while inserting update NSE1_Update; if(NSE2_Update.size()>0) update NSE2_Update; /* map<id,account> nse1map = new map<id,account>(); nse1map.putall(NSE1_Update); if(nse1map.size()>0){ update nse1map.values(); } map<id,account> nse2map = new map<id,account>(); nse2map.putall(NSE2_Update); if(nse2map.size()>0){ update nse2map.values(); } */ } public static void ChildToParnet (Id ChildId){ For(Account acc : [select id,name, parentid, (Select id,NSE_1__c,NSE_2__c from contacts)from account where id =: ChildId]){ For(Contact c : acc.contacts ){ if(c.NSE_1__c == true) NSEint1 = NSEint1 +1; if(c.NSE_2__c == true) NSEint2 = NSEint2 + 1; } NSEmap1.put(acc.id,NSEint1); NSEmap2.put(acc.id,NSEint2); if(acc.parentid != null) childToParnet(acc.parentid); } } } Helper Class ============= public class AccountHierarchyUtil{ public static set<id> ChildToParnet (Id PAccountID){ set<id> setactid = new set<id>(); Id accountId = PAccountID; Account[] allparents = new Account[] {}; Set<Id> parentIds = new Set<Id>{accountId}; Account[] parent; do { parent = [select Id,ParentId, Name from Account where Id in :parentIds]; allparents.addAll(parent); parentIds.clear(); for (Account par : parent) parentIds.add(par.ParentId); } while (parent.size() > 0); list<Account> Act = [select id, name from account where id in :allparents]; for(Account A : Act){ system.debug('Parent Accounts ' + a.name); setactid.add(a.id); } return setactid; } public static set<id> ParnetToChild (Id PAccountID){ set<id> setactid = new set<id>(); Id accountId = PAccountID; Account[] allChildren = new Account[] {}; Set<Id> parentIds = new Set<Id>{accountId}; Account[] children; do { children = [select Id, Name from Account where ParentId in :parentIds]; allChildren.addAll(children); parentIds.clear(); for (Account child : children) parentIds.add(child.Id); } while (children.size() > 0); list<Account> Act = [select id, name from account where id in :allChildren]; for(Account A : Act){ system.debug('Child Accounts ' + a.name); setactid.add(a.id); } return setactid; } }
Thanks
Sudhir
Tracing the process flow would tell you how to avoid the duplicates but if you want a quick fix. Iterate the final udpate list through a set and update it. Set by its own property removes the duplicates
Hope it helps
RD