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
k2018123k2018123 

trigger for three objects

Hi,
Can someone please help with the sample code snippet for trigger:
Hi Have three objects - (A , B and C).
I have an external system that is creating a single record in object C and bulk of records in object B. I want a trigger that as soon as a record is inserted or updated in obejct C, copy the record values from object B and insert/update it in Object A.

Thanks.
Best Answer chosen by k2018123
Nayana KNayana K
trigger JobTrigger on ObjectA__c(after insert)
{
    JobTriggerHandler objHandler = new JobTriggerHandler();
	
	if(Trigger.isInsert && Trigger.isAfter)
	{
		objHandler.onAfterInsert(Trigger.New);
	}
}
 
public class JobTriggerHandler
{

	public void onAfterInsert(List<ObjectA__c> lstNewObjA)
	{
		Set<String> setUniqueId = new Set<String>();
		
		for(ObjectA__c objA : lstNewObjA)
		{
			if(String.isNotBlank(objA.uniqueId__c))
			{
				setUniqueId.add(objA.uniqueId__c);
			}
		}
		
		if(!setUniqueId.isEmpty())
		{
			List<ObjectC__c> lstObjC = new List<ObjectC__c>();
			for(ObjectB__c objB: [SELECT field1__c, field2__c FROM ObjectB__c WHERE uniqueId__c IN: setUniqueId])
			{
				lstObjC.add(new ObjectC__c(uniqueId__c = objB.uniqueId__c, field1replica__c = objB.field1__c, field2replica__c = objB.field2__c));
			}
			if(!lstObjC.isEmpty())
				insert lstObjC;
		}
	}
}

You can do something like above.

All Answers

Nayana KNayana K
Please mention the relationship of these objects and the proper requirement.
k2018123k2018123
Hi Nayana,

So the requirement goes something like this:
Object A - job monitoring object. It has the unique Id which gets populated and tells salesforce that bulk upload has been done on object B. Object B records also have this unique Id. As soon as a record is created in Object A with the unique Id, i need to pick up those records from object B with same unique id, and populate those records in object C.

Thanks.
Nayana KNayana K
trigger JobTrigger on ObjectA__c(after insert)
{
    JobTriggerHandler objHandler = new JobTriggerHandler();
	
	if(Trigger.isInsert && Trigger.isAfter)
	{
		objHandler.onAfterInsert(Trigger.New);
	}
}
 
public class JobTriggerHandler
{

	public void onAfterInsert(List<ObjectA__c> lstNewObjA)
	{
		Set<String> setUniqueId = new Set<String>();
		
		for(ObjectA__c objA : lstNewObjA)
		{
			if(String.isNotBlank(objA.uniqueId__c))
			{
				setUniqueId.add(objA.uniqueId__c);
			}
		}
		
		if(!setUniqueId.isEmpty())
		{
			List<ObjectC__c> lstObjC = new List<ObjectC__c>();
			for(ObjectB__c objB: [SELECT field1__c, field2__c FROM ObjectB__c WHERE uniqueId__c IN: setUniqueId])
			{
				lstObjC.add(new ObjectC__c(uniqueId__c = objB.uniqueId__c, field1replica__c = objB.field1__c, field2replica__c = objB.field2__c));
			}
			if(!lstObjC.isEmpty())
				insert lstObjC;
		}
	}
}

You can do something like above.
This was selected as the best answer
k2018123k2018123
Hi Nayana,

Thanks.
k2018123k2018123
Hi Nayana,
one more doubt:-
if i want to update the objB record as well, is it the correct approach:-
 
public class JobTriggerHandler
{
    public void onAfterInsert(List<Job_Control__c> lstNewObjA)
    {
        Set<String> setUniqueId = new Set<String>();
        for(Job_Control__c objA : lstNewObjA)
        {
            if(String.isNotBlank(objA.Unique_Id__c ) && objA.Status__c == 'Under Processing')
            {
                setUniqueId.add(objA.Unique_Id__c );
            }
        }
        if(!setUniqueId.isEmpty())
        {
            List<Staging_Course__c> lststag = new List<Staging_Course__c>();
            List<Course__c> lstObjC = new List<Course__c >();
            for(Staging_Course__c  objB: [SELECT test_Field__c , test_field_1__c,name  FROM Staging_Course__c WHERE Unique_Id__c  IN: setUniqueId])
            {
                
                lstObjC.add(new Course__c( test_Field__c  = objB.test_Field__c, test_field_1__c  = objB.test_field_1__c , name = objB.name ));
                objB.Status__c = 'Completed';
                update objB;
            }
            if(!lstObjC.isEmpty())
                insert lstObjC;
            
        }
    } 
}

 
Nayana KNayana K
public class JobTriggerHandler
{
    public void onAfterInsert(List<Job_Control__c> lstNewObjA)
    {
        Set<String> setUniqueId = new Set<String>();
        for(Job_Control__c objA : lstNewObjA)
        {
            if(String.isNotBlank(objA.Unique_Id__c ) && objA.Status__c == 'Under Processing')
            {
                setUniqueId.add(objA.Unique_Id__c );
            }
        }
        if(!setUniqueId.isEmpty())
        {
            List<Staging_Course__c> lststag = new List<Staging_Course__c>();
            List<Course__c> lstObjC = new List<Course__c >();
            for(Staging_Course__c  objB: [SELECT test_Field__c , test_field_1__c,name, Status__c  FROM Staging_Course__c WHERE Unique_Id__c  IN: setUniqueId])
            {
                
                lstObjC.add(new Course__c( test_Field__c  = objB.test_Field__c, test_field_1__c  = objB.test_field_1__c , name = objB.name ));
				objB.Status__c = 'Completed';
                lststag.add(objB);
                
            }
			if(!lststag.isEmpty())
                insert lststag;
            if(!lstObjC.isEmpty())
                insert lstObjC;
            
        }
    } 
}

Always DML should be outside for loop.