Контекстная переменная Apex Trigger - PullRequest
1 голос
/ 09 декабря 2011

Вот мой код для триггера апекса.

trigger LeadTrigger on Lead (after insert) 
{
      if(Trigger.isInsert){
             for(Lead newLead: Trigger.new)
             {
                 //newLead.RecrodTypeId  //'Give value of record type id.
                 //newLead.RecordType.Name //'Null'
             }
      }
}

Почему «newLead.RecordType.Name» возвращает ноль?

Ответы [ 4 ]

2 голосов
/ 14 декабря 2011

Списки объектов, доступных в триггерах, имеют значения только для тех полей объекта, на котором запущен триггер.Никакие отношения не просматриваются, включены только идентификаторы записей поиска.

Следовательно, для получения дополнительной информации, связанной с необходимыми объектами, из связанных объектов необходимо запросить.хочу сделать что-то вроде этого:

trigger LeadTrigger on Lead (after insert) {

    map<id, RecordType> mapRecordTypes = new map<id, RecordType>();

    if(Trigger.isInsert) {
        for(Lead newLead: Trigger.new) {
            mapRecordTypes.put(newLead.RecordTypeId, null);
        }
    }

    for(RecordType rt : [select Id, Name from RecordType
                           where Id in : mapRecordTypes.ketSet()]) {
        mapRecordTypes.put(rt.Id, rt);
    }

    for(Lead newLead : Trigger.new) {
        string recordTypeName = mapRecordTypes.get(sLead.RecordTypeId).Name;
    }
}
1 голос
/ 10 декабря 2011

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

[EDIT]

Теперь я думаю, что понимаю проблему (из вашего комментария).Причина в том, что, поскольку вы находитесь в триггере, связанный объект RecordType , на который ссылается , недоступен.RecordTypeId всегда будет доступен, поскольку он буквально является частью объекта триггера в качестве идентификатора.Однако дочерние объекты (ссылочные объекты) не будут доступны для простой ссылки из триггера.Для этого необходимо создать карту рассматриваемого объекта, на который делается ссылка, с помощью дополнительного вызова SOQL WHERE Id IN: theIdList.

Из Apex, а не в триггере, вам нужно специально вызвать это поле изваш SOQL подобен этому:

List<Lead> leads = [SELECT Id, RecordType.Name FROM Lead];

То, что только что произошло, это то, что дочерний объект, в данном случае RecordType, был включен в запрос и поэтому доступен для вас.По умолчанию для триггера не будут предварительно выбраны все ваши дочерние объекты, и поэтому его необходимо впоследствии выбирать из триггера или класса, вызываемого триггером:

List<Id> recIds = new List<Id>();
for(Lead l : leads)
{
   recIds.add(l.RecordTypeId);
}

List<RecordType> rt = [SELECT Id, Name FROM RecordType WHERE Id IN :recIds];
Map <Id, String> idRecNameMap = new Map<Id, String>();
for(RecordType r : rt)
{
   idRecNameMap.put(r.Id, r.Name);
}

// And finally...
for(Lead l : Trigger.new)
{
   String tmpRecordTypeName = idRecNameMap.get(l.RecordTypeId);
}

Я не тестировал этот код, но ядумаю, это выглядит хорошо.Надеюсь, что это имеет смысл.

0 голосов
/ 04 июня 2015

вы не можете получить дополнительную информацию о связанных объектах из этого триггера.если вы хотите получить больше информации, вам нужно сделать запрос для других объектов.

List<RecordType> records = [SELECT Id, Name FROM RecordType WHERE Id = newLead.RecrodTypeId];
string myname = records[0].name;

, но помните, что вы не должны делать запрос для цикла .так что если вы хотите сделать это правильно, обратитесь к решению Адама.

0 голосов
/ 09 декабря 2011

Поместите некоторую системную отладку в цикл и проверьте журналы отладки системы для получения дополнительной информации

system.debug('lead:' + newLead);

внутри цикла for и посмотрите, что передается внутрь. Вы можете обнаружить, что это ноль.

Мы не можем дать вам хороший ответ, не зная об остальных ваших настройках.

...