function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
SFDC GuestSFDC Guest 

Apex trigger to update child field value with parent field

Hi, I am trying to update the child object - Vacancy_D2D__c field name-"Worksite_Location__c" with parent object TR1__Job__c field "TR1__Account__r.Name". But unable to do it. below is helper class. plz help.

public class UpdateCtr
{
public void setAccountName(List<Vacancy_D2D__c> vacancySchedules) {
        for (Vacancy_D2D__c vacancyD2D : vacancySchedules) {
            if (Vacancy_D2D__c.Worksite_Location__c == null) {
               
         TR1__Job__c job = [SELECT Id, TR1__Account__r.Name FROM TR1__Job__c WHERE Id = :vacancyD2D.Vacancy__c];
      
                vacancyD2D.Worksite_Location__c = job.TR1__Account__r.Name;
            }
        }
    }
}
Srinivasa Chary TaduriSrinivasa Chary Taduri
Just replace your code with below. It should work.


public class UpdateCtr
{
    public void setAccountName(List<Vacancy_D2D__c> vacancySchedules) 
    {
        Set<String> vSetVacId = new Set<String>();
        
        for (Vacancy_D2D__c vacancyD2D : vacancySchedules) 
        {
            vSetVacId.add(vacancyD2D.Vacancy__c);
        }
        
        Map<TR1__Job__c> vMapTRIdTR = new Map<TR1__Job__c>([SELECT Id, TR1__Account__r.Name FROM TR1__Job__c WHERE Id In :vSetVacId]);
        
        for (Vacancy_D2D__c vacancyD2D : vacancySchedules) 
        {
            if (Vacancy_D2D__c.Worksite_Location__c == null && vacancyD2D.Vacancy__c != null) 
            {
                vacancyD2D.Worksite_Location__c = vMapTRIdTR.get(vacancyD2D.Vacancy__c).TR1__Account__r.Name;
            }
        }
    }
}


Please mark it as correct.
Srinivasa Chary TaduriSrinivasa Chary Taduri
I just removed SOQL from inside the for loop and updated the code. Please use above code and mark it as correct.
Nayana KNayana K
We shouldn't have SOQL inside for-loop.
Please follow the best practices:
https://developer.salesforce.com/blogs/developer-relations/2015/01/apex-best-practices-15-apex-commandments.html
 
public class VacancyHandler
{
	public void onBeforeInsert(List<Vacancy_D2D__c> lstNewVacancySchedule)
	{
		setAccountName(lstNewVacancySchedule);
	}
	
	public void onBeforeUpdate(List<Vacancy_D2D__c> lstNewVacancySchedule)
	{
		setAccountName(lstNewVacancySchedule);
	}
	
	private void setAccountName(List<Vacancy_D2D__c> lstNewVacancySchedule) 
	{
		Set<Id> setJobId = new Set<Id>();
		Map<Id, TR1__Job__c> mapJob = new Map<Id, TR1__Job__c>();
		
		// collect parent job Id 
		for(Vacancy_D2D__c objVacancySchedule : lstNewVacancySchedule)
		{
			if(String.isBlank(objVacancySchedule.Worksite_Location__c) && objVacancySchedule.Vacancy__c != null)
			{
				setJobId.add(objVacancySchedule.Vacancy__c);
			}
		}
		
		if(!setJobId.isEmpty())
		{
			mapJob = new Map<Id, TR1__Job__c>([SELECT Id, TR1__Account__r.Name FROM TR1__Job__c WHERE Id IN: setJobId]);
			for(Vacancy_D2D__c objVacancySchedule : lstNewVacancySchedule)
			{
				if(mapJob.containsKey(objVacancySchedule.Vacancy__c))
				{
					objVacancySchedule.Worksite_Location__c = mapJob.get(objVacancySchedule.Vacancy__c).TR1__Account__r.Name;
				}
			}
		}
	}
}
 
trigger VacancyTrigger on Vacancy_D2D__c(before insert, before update)
{
	VacancyHandler objHandler = new VacancyHandler();
	if(Trigger.isBefore )
	{
		if(Trigger.isInsert)
		{
			objHandler.onBeforeInsert(Trigger.New);
		}
		else if(Trigger.isUpdate)
		{
			objHandler.onBeforeUpdate(Trigger.New);
		}
	}
}

 
SFDC GuestSFDC Guest
Hi Nayana & Srini,  i tried both but not working
SFDC GuestSFDC Guest
I am trying to update the child object - Vacancy_D2D__c field name-"Work_Shift_Location_lkId__c" with parent object TR1__Job__c field "TR1__Account__r.Name". but not updating. Plz help
below is helper class.

public void setAccountName(List<Vacancy_D2D__c> vacancySchedules)
{
Set<String> vSetVacId = new Set<String>();
for (Vacancy_D2D__c vacancyD2D : vacancySchedules)
{
vSetVacId.add(vacancyD2D.Vacancy__c);
}
Map< Id, TR1__Job__c> vMapTRIdTR = new Map<Id, TR1__Job__c>();
vMapTRIdTR.putAll([SELECT Id, TR1__Account__r.Name FROM TR1__Job__c WHERE Id In :vSetVacId]);
for (Vacancy_D2D__c vacancyD2D : vacancySchedules)
{
if (Vacancy_D2D__c.Work_Shift_Location_lkId__c == null && vMapTRIdTR.containskey(vacancyD2D.Vacancy__c))
{
vacancyD2D.Work_Shift_Location_lkId__c = vMapTRIdTR.get(vacancyD2D.Vacancy__c).TR1__Account__r.Name ;
} } }

trigger:

trigger VacancyD2DTrigger on Vacancy_D2D__c (before insert, before update, before delete, after insert , after update , after delete) {
VacancyD2DTriggerHandler vth = new VacancyD2DTriggerHandler(trigger.new,trigger.old,trigger.newMap,trigger.oldMap); if (Trigger.isBefore)
{ if (Trigger.isInsert || Trigger.isUpdate)
{
// Call class logic here!
vth.setAccountName(trigger.new);
} } }
Srinivasa Chary TaduriSrinivasa Chary Taduri
Hi Sohel,

What is the the lookup field api name on the child object?