Apex Trigger Contect Variable

Asked by At

Here my code for apex trigger.

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

      }

}

Any one can please explain why "newLead.RecordType.Name" return's null?

4 Answers

-2
c14kaa On

Put some system debug inside the loop and check your system debug logs for more information

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

inside the for loop and see what is being passed in. You may find that it is null.

We cant really give you a good answer without knowint the rest of your set up.

1
Adam On

This is probably because some of your leads that just got inserted don't have record types associated with them. This is normal. You can enforce that record type selection is mandatory through configuration, if that's what you're looking for.

[EDIT]

Now I think I understand the issue (from your comment). The reason is that since you're in a trigger, the associated RecordType referenced object is not available. The RecordTypeId will always be available since it is literally part of the trigger object as an Id. However, child objects (referenced objects) will not be available to simply reference from within a trigger. To do this you need to create a map of the referenced object in question by doing an additional SOQL call WHERE Id IN: theIdList.

From Apex, not in a trigger, you need to specifically call this field out from your SOQL like this:

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

What just happened there is that the child object, the RecordType in this case, was included in the query and therefore available to you. By default a trigger will not have all of your child objects pre-selected and therefore need to be selected afterwards from within the trigger or class called by the trigger:

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

I did not test this code but I think it look ok. Hope this makes sense.

2
Matt Lacey On

The lists of objects available in triggers only have values for the fields on the object the trigger is running on. No relationships are traversed, only the IDs of the lookup records are included.

Therefore, to pull in any extra information you need to from related objects needs to be queried for.

You'll want to do something like this:

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;
    }
}
0
Daniel On

you can't get extra information on the related objects from this trigger. if you want to get more information you need to make query for other objects.

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

but remember that you shouldn't make a query in for loop. so if you wanted to do it in the right way go for Adam's solution.