You need to sign in to do that
Don't have an account?
SFDC@Error
Update & Create child based on parent update
Hi All
How can I update and create child record based on the parent? Like in the parent, I have a picklist field with value 1,2,3,4 and Budget Amount is 2000.and in the child there is no record. If I select picklist value 2 and save it will create 2 child record with budget amount 1000 and 1000.but if i select picklist value 4 then it is creating 4 records with budget amount 500,500,500,500 like. Problem is here record is creating new 4 child record .but i want to update existing record and create new 2 records
.
How can I update and create child record based on the parent? Like in the parent, I have a picklist field with value 1,2,3,4 and Budget Amount is 2000.and in the child there is no record. If I select picklist value 2 and save it will create 2 child record with budget amount 1000 and 1000.but if i select picklist value 4 then it is creating 4 records with budget amount 500,500,500,500 like. Problem is here record is creating new 4 child record .but i want to update existing record and create new 2 records
trigger Pay on Parent__c (before update) { Set<Id> ids = new Set<Id>(); list<child__c> ids1= new list<child__c >(); for(Opportunity rr : Trigger.new) { if (Trigger.oldmap.get(rr.id).Number__c!= Trigger.newmap.get(rr.id).Number__c ) { for(integer i = 0; i< integer.valueOf(rr.Number__c); i++){ child__c c= new child__c(); c.name = rr.Name ; c.Parent__c= rr.id; c.Pay=rr.Pay/rr.Number__c ids1.add(c); } } } if(!ids1.isEmpty()){ upsert ids1; } }
.
Please use the below code for you refernce:
I am using the Program__C object instead of child__c Object. And Opportunity as Parent.
Please gothrough the code entierly and understand clearly.
I tested it's working fine to me.
===============
trigger PayTrigger on Opportunity (before update) {
Set<Id> ids = new Set<Id>();
list<Project__c> ids1= new list<Project__c >();
list<Project__c> ids2= new list<Project__c >();
Map<Id,Integer> oppOldMap = new Map<Id,Integer>();
Map<Id,Integer> childsizeMap = new Map<Id,Integer>();
Map<Id,List<Project__c>> childMap = new Map<Id,List<Project__c>>();
for(Opportunity rr : Trigger.new) {
if (Trigger.oldmap.get(rr.id).Program__c!= Trigger.newmap.get(rr.id).Program__c ) {
ids.add(rr.Id);
if(Trigger.oldmap.get(rr.id).Program__c != null)
oppOldMap.put(rr.Id,integer.valueOf(Trigger.oldmap.get(rr.id).Program__c));
}
}
List<opportunity> oppLst = new List<Opportunity>();
if(ids.size() > 0)
{
oppLst = [Select Id,Name,Amount,Program__c,(Select Id,Name,Opportunty_Name__c,Pay__c from Project__r) from Opportunity where Id IN: ids]; /// Use you child Object relationshipname
}
if(oppLst.size() > 0)
{
for(Opportunity o : oppLst)
{
childsizeMap.put(o.Id,o.Project__r.size());
for(Project__c poj : o.Project__r)
{
if(childMap.containsKey(poj.Opportunty_Name__c))
childMap.get(poj.Opportunty_Name__c).add(poj);
else
childMap.put(poj.Opportunty_Name__c , new List<Project__c>{poj});
}
}
}
for(Opportunity opp : Trigger.new)
{
Integer childs = 0;
if(childsizeMap.containsKey(opp.Id))
{
childs = childsizeMap.get(opp.Id);
}
Integer newProgram = 0;
if(opp.Program__c != null)
newProgram = integer.valueOf(opp.Program__c);
if(childs > 0 && oppOldMap.containsKey(opp.Id) && (newProgram > oppOldMap.get(opp.Id)) )
{
Integer isize = integer.valueOf(opp.Program__c) - childs;
if(isize > 0 )
{
for(integer i = 0; i<isize ; i++){
Project__c c= new Project__c();
c.name = opp.Name ;
c.Opportunty_Name__c= opp.id;
c.Pay__c = opp.Amount / Integer.valueOf(opp.Program__c);
ids1.add(c);
}
for(Project__c p : childMap.get(opp.Id))
{
system.debug('@@@ Update Project ');
Project__c pro = new Project__c(id = p.Id);
pro.Pay__c = opp.Amount / Integer.valueOf(opp.Program__c);
ids2.add(pro);
}
}
}
else
{
Integer oldValue = 0;
if(oppOldMap.get(opp.Id) != null)
{
oldValue = oppOldMap.get(opp.Id);
}
if(opp.Program__c != null && (newProgram > oldValue))
{
for(integer i = 0; i< integer.valueOf(opp.Program__c) ; i++){
Project__c c= new Project__c();
c.name = opp.Name ;
c.Opportunty_Name__c= opp.id;
c.Pay__c = opp.Amount / Integer.valueOf(opp.Program__c);
ids1.add(c);
} }
}
}
if(ids2.size() > 0)
update ids2;
if(ids1.size() > 0)
insert ids1;
}
===================
Can you please Let me know if it helps or not!!!
If it helps don't forget to mark this as a best answer!!!
Thanks,
Maharajan.C