Marc Zaharescu
Marc Zaharescu

Reputation: 639

Salesforce Trigger to populate a lookup field

I am trying to create salesforce trigger on Lead that auto-populates a look up field which links the current Lead to an existing Account if there exist an Account with the same name as the Lead's Company custom field.

This is my code:

trigger Link_Lead_To_Account on Lead (before insert ) {

 Set<String> whatIDs = new Set<String>();
 MAP<id,String> accountMap= new MAP<id,String>();

 // save the leads that have been triggered
    for (Lead l : Trigger.new) { 
     whatIDs.add(l.id);      
    }

List<Lead> leads = [SELECT Id,Company FROM Lead where ID=:whatIDs ];

// loop through the triggered leads, if the account.name == to lead.company then link the found account to the lead
 for (Integer i = 0; i <Trigger.new.size(); i++)
{
// System.Debug('++++++++++++++'+Trigger.new[i].company+Trigger.new[i].id);
   if(accountMap.get(Trigger.new[i].company)!=null)
   { 
       for(Account ac :[Select name,id from Account])
       {
           if(Trigger.new[i].Company==ac.Name)
           { 
               Trigger.new[i].Account__c=  ac.id;
                break;
           }
       }

   }
//  System.Debug('Trigger.new[i].Account__c::::'+Trigger.new[i].Account__c);
//  System.Debug('Trigger.new[i].company:::::'+Trigger.new[i].company);
//  System.Debug('Trigger.new[i].ID:::::'+Trigger.new[i].ID);

}
update leads;   

}

But it doesn't work at all. It throws the following error:

Review all error messages below to correct your data.
Apex trigger Link_Lead_To_Account caused an unexpected exception, contact your administrator: Link_Lead_To_Account: execution of AfterInsert caused by: System.StringException: Invalid id: TestAccount2: External entry point

As it requires the Company field to be an ID, but when I write an ID it does't perform any changes.

Upvotes: 0

Views: 1727

Answers (1)

Marc Zaharescu
Marc Zaharescu

Reputation: 639

I managed to fix it. This is the working class where newLeads.Values() is being populated in the constructor with to the Trigger.new() values on the before insert event:

public void LinkLeadToAccount() {

Set<String> companies = new Set<String>();
for (Lead l: newLeads.values()) {
    if (l.Company != null) companies.add(l.Company);
}

if (companies.size() > 0) {

    // Pick most recent Account where more than one with same name
    Map<String, Id> accountNameToId = new Map<String, Id>();
    for (Account a : [
            select Name, Id
            from Account
            where Name in :companies
            order by CreatedDate
            ]) {
        accountNameToId.put(a.Name, a.Id);
    }

    if (accountNameToId.size() > 0) {
        Lead[] updates = new Lead[] {};
        for (Lead l: newLeads.values()) {
            if (l.Company != null) {
                Id accountId = accountNameToId.get(l.Company);
                if (accountId != null) {
                    updates.add(new Lead(Id = l.Id, Account__c = accountId));
                }
            }
        }
        System.debug(' leads_to_update : ' + updates.size() + '   leads_to_update : ' +  updates);        
        update updates;
    }
}

}

Upvotes: 0

Related Questions