2016-01-12 2 views
0

Я пытаюсь создать триггер Salesforce на Lead, который автоматически заполняет поле поиска, которое связывает текущий Lead с существующей учетной записью, если существует учетная запись с тем же именем, что и компания Lead's Company поле.Salesforce Trigger, чтобы заполнить поле поиска

Это мой код:

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; 

}

Но это не работает. Он выдает следующее сообщение об ошибке:

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 

Как это требует поля компании быть ID, но когда я пишу ID это does't выполнения каких-либо изменений.

+0

Почему вам обновление приводит объект ? whatIDs будет пустым все время. Я считаю, что до того, как триггер еще не имеет идентификаторов. –

+0

Что такое TestAccount2? –

+0

testAccount2 - это имя учетной записи, которую я использовал для целей тестирования –

ответ

0

Мне удалось это исправить. Это рабочий класс, где newLeads.Values ​​() заселяется в конструкторе с к Trigger.new() значения на перед вставкой события:

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; 
    } 
} 

}

+0

Работает ли она нормально? Вы протестировали его? –

+0

Да, это хорошо работает, кроме массовых импортных/обновлений. Поэтому мне придется его обновить. –

+0

Я обновил до окончательной рабочей версии –

Смежные вопросы