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
Irish@accIrish@acc 

urgent!! Trigger to update Project State field on parent object

Hi All,

I have two object in the related list and if Approal Status on both the object changes to "Approved " then the Project_State__c field on the parent object changes to "Closed".

 

I have written the trigger but It's not working...please help me

 

trigger Update_Project_State on Project__c (before update) {

 

for(Project__c Prj:trigger.New){

 List<Quality_of_Delivery__c> Lstqod= new LIST<Quality_of_Delivery__c>();//object-1 MD relation

 List<Root_Cause__c> LstRC= new LIST<Root_Cause__c>();       //object-2 lookup    

 

Lstqod=[Select project__c,Final__c,Approved_Status__c from Quality_of_Delivery__c where project__c=: prj.Id];//Query qod      

 

LstRC=[Select Project_Name__c,Final__c,Approval_Status__c from Root_Cause__c where Project_Name__c=: j.Id];               

List<Project__c> prjupdate= new List<Project__c>();

            if(LstRC!=null){        for(Root_Cause__c r:LstRC){  

            if(r.Approval_Status__c=='Approved' && r.Final__C==True)  

             {                

              if(Lstqod!=null){     

                                  for(Quality_of_Delivery__c q:lstqod)  {    

                                            

                            if(q.Approved_Status__c=='Approved' && q.Final__c==True){

                                                             

                                   if(prj.Project_State__c=='Active'){                         

                                                     prj.Project_State__c='Closed';    

                                                     prjupdate.add(prj);      

                               }                                                                                                      

                           else if(prj.Project_State__c=='In Cancellation')

                                          {                                 

                                  prj.Project_State__c='Cancelled';                             

                                     prjupdate.add(prj);                              

   }                                                                                                                                                                       

   }

}                                                                     

update prjupdate;                                                                                                                                   

        }       

        }                                          

    }       

   }                                                               

}

}

jbroquistjbroquist

Since your trigger logic needs to be fired once the approval status of the child record is set to approved, then your trigger should run from the child object, not the parent. I've written up some code for you that should help you understand this:

 

trigger MyTrigger on ChildObject__c (after update)
{
	//create set of parent object ids to check approval against
	Set<Id> parentIds = new Set<Id>();

	for(ChildObject__c childObj : Trigger.new)
	{
		//check if the child object is related to a parent object and
		//that the approval status has been changed to approved
		if(childObj.ParentObject__c != null && childObj.ApprovalStatus__c == 'Approved' && trigger.oldMap.get(childObj.Id).ApprovalStatus__c != 'Approved')
			//add the parent object id to the unique set
			parentIds.add(childObj.ParentObject__c);
	}

	//create a map of all the parent objects that don't have an approved status
	Set<Id> unapprovedChildren = new Set<Id>();

	//query all child objects related to the parent ids
	ChildObject__c[] children = [SELECT Id, ParentObject__c, ApprovalStatus__c FROM ChildObject__c WHERE ParentObject__c IN :parentIds];

	//iterate through all the child records and see which haven't been approved yet
	for(ChildObject__c childObj : children)
	{
		if(childObj.ApprovalStatus__c != 'Approved')
			unapprovedChildren.add(childObj.ParentObject__c);
	}

	//query all parent records to update project state to Closed
	ParentObject__c[] parents = [SELECT Id, Project_State__c FROM ParentObject__c WHERE Id IN :parentIds AND Id NOT IN :unapprovedChildren];
	for(ParentObject__c parent : parents)
	{
		parent.Project_State__c = 'Closed';
	}

	if(parents.size() > 0) update parents;

}

 

Let me know if you have any questions.

Irish@accIrish@acc
Thanks for the reply ...but what about the other object?
if the approval status on both the object changes to approved the the project_State__c changes to closed
Irish@accIrish@acc
in the above example you have cosider only the child object and not the other object which is in lookup with the parent object ...please explain
Naidu PothiniNaidu Pothini
First Trigger:

trigger QualityofDeliveryTrigger on Quality_of_Delivery__c(after update) { List<Id> parentIds = new List<Id>(); List<Project__c> projectsToUpdate = new List<Project__c>(); for(Quality_of_Delivery__c ch1 : Trigger.new) { if(ch1.Approval_Status__c == 'Approved' && trigger.oldMap.get(ch1.Id).Approval_Status__c <> 'Approved') { parentIds.add(ch1.Project__c); } } Map<Id, Project__c> parentMap = new Map<Id, Project__c>([SELECT Id, Project_State__c, Final__c, Approval_Status__c FROM Project__c WHERE Id IN :parentIds]); for(Root_Cause__c ch2 : [SELECT Id, Project_Name__c, Approval_Status__c FROM Root_Cause__c WHERE Project_Name__c IN :parentIds]) { if(ch2.Approved_Status__c == 'Approved') { Project__c pj = parentMap.get(ch2.Project_Name__c); if(pj.Project_State__c == 'Active') { pj.Approval_Status__c = 'Closed';
projectsToUpdate.add(pj);
}
else if(pj.Project_State__c == 'In Cancellation')
{
pj.Approved_Status__c = 'Cancelled';
projectsToUpdate.add(pj);
}
}
}
update projectsToUpdate;
}

 

Second Trigger:

trigger RootCauseTrigger on Root_Cause__c(after update) { List<Id> parentIds = new List<Id>(); List<Project__c> projectsToUpdate = new List<Project__c>(); for(Root_Cause__c ch1 : Trigger.new) { if(ch1.Approval_Status__c == 'Approved' && trigger.oldMap.get(ch1.Id).Approval_Status__c <> 'Approved') { parentIds.add(ch1.Project__c); } } Map<Id, Project__c> parentMap = new Map<Id, Project__c>([SELECT Id, Project_State__c, Final__c, Approval_Status__c FROM Project__c WHERE Id IN :parentIds]); for(Quality_of_Delivery__c ch2 : [SELECT Id, Project__c, Approval_Status__c FROM Quality_of_Delivery__c WHERE Project_c IN :parentIds]) { if(ch2.Approved_Status__c == 'Approved') { Project__c pj = parentMap.get(ch2.Project__c); if(pj.Project_State__c == 'Active') { pj.Approval_Status__c = 'Closed';
projectsToUpdate.add(pj); } else if(pj.Project_State__c == 'In Cancellation') { pj.Approved_Status__c = 'Cancelled';
projectsToUpdate.add(pj); } } } update projectsToUpdate; }

 

You have one Parent object (Project__c)  and two child objects (Quality_of_Delivery__c, Root_Cause__c), so you need to write trigger on both the child objects.

 

Try this.