2013-05-22 2 views
1

Я хочу, чтобы установить Lookup поле с помощью апекс триггер Salesforce, но я получаю сообщение об ошибке:Как установить Lookup Field через Salesforce Trigger

System.StringException: Invalid id: 

У меня есть пользовательский объект под названием Job__c. Он имеет пользовательский список выбора для аккаунтов: Acct__c.

Пользователь заполнит Acct__c как John Deer, триггер должен добавить John Deer в поле поиска Account__c.

Вот триггер:

trigger UpdateAccounts on Job__c (before insert) { 
    for (Job__c obj: trigger.new){ 
     obj.Account__c = obj.Acct__c;   //Exception is thrown here 
} 

Исключение брошено:

System.StringException: Invalid id: 

Я пытался что-то другое:

List <Job__c> opListInsert = new List<Job__c>(); 
List <Job__c> opListUpdate = new List<Job__c>(); 
if(trigger.isInsert){ 
    for(Job__c op:trigger.New){ 
     if(op.Acct__c != Null){ 
      op.Account__c = op.Acct__c; 
      opListInsert.add(op); 
     } 
    } 
} 
else if(trigger.isUpdate){ 
    for(Job__c op:trigger.New){ 
     if(op.Acct__c != Null && op.Acct__c !=trigger.oldMap.get(op.id).Acct__c){ 
      op.Account__c = op.Acct__c; 
      opListUpdate.add(op); 
     }  
    } 
} 

Этот код кидает:

Error:Apex trigger UpdateAccounts caused an unexpected exception, contact your 
administrator: UpdateAccounts: execution of BeforeUpdate caused by: 
System.StringException: Invalid id: 

Что я делаю неправильно, что он говорит мне, что это неверный идентификатор?

ответ

1

Account__c - это поле поиска, вы не можете назначить ему строку (поле выбора). Вместо этого вы должны назначить ему идентификатор учетной записи.

Я не уверен, почему вы используете имена учетных записей в поле списка выбора, но если вы хотите продолжить это, тогда есть простое решение, что имена учетных записей уникальны.

Получить идентификатор для учетной записи, выбранной в запросе для идентификатора, что-то вроде этого:

list<account> acclist = [select id from account where name In yourNameList]; 

, а затем в ссылке спускового идентификатор

obj.account__c = accList[0].id; 

использование Make карт, сделать не добавляйте soql внутрь для цикла

+0

Спасибо. Это для внешней VF-страницы, где пользователь может выбрать учетную запись. В противном случае пользователю необходимо вводить данные непосредственно в поле учетной записи, но мы не хотим, чтобы они просматривали все учетные записи (чтобы не поместить поиск по учетным записям непосредственно на странице VF). Я не знаю, чистая. Какие-либо предложения? –

0

Вы должны установить свое поле с идентификатором объекта, к которому вы хотите привязать.

На странице браузера Salesforce есть удобный инструмент dandy, который позволяет вам вводить неполную информацию в поле поиска, и она автоматически заполняет ее для вас. Этого не происходит, когда значения присваиваются вручную с помощью инструкции apex. Вы можете установить значение только для действительного и существующего идентификатора объекта, к которому был привязан поиск.

Этот код будет захватывать ID данную name и делать то, что вы хотите:

trigger UpdateAcct on Job__c (before insert, before update) { 

    List<String> Accounts = new List<String>(); 
    for (Job__c obj: trigger.new){ 
     Accounts.add(obj.Acct__c); 
    } 

    list<Account> acctlist = [select Name from account where Name in :Accounts]; 

    if (acctlist.size() > 0){ 

     for (Integer i = 0; i < Trigger.new.size(); i++) 
     { 

      if (Trigger.new[i].Acct__c != null) 
      { 
       Trigger.new[i].Account__c = acctlist[i].ID; 
      } 
      else 
      { 
       Trigger.new[i].Account__c = null; 
      } 
     } 

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