You need to sign in to do that
Don't have an account?
imishra
Update picklist value from Parent-child
Hi,
I have a master detail relation between Opportunity and object__c(custom object)
I have same stage fields as in opportunity in object__c.
I want to update the stage value from opportunity to object__c only when the object__c record is created. After that the object__c record can have its own stage values different from Opportunity.
I have written the below trigger, but it updates the object__c record everytime there is some update on opportunity, where as i want it to fire only once when the object record is created.
trigger updateLineItemValues on Opportunity (before update){
Set<ID> oppids = new Set<ID>();
for(Opportunity opp : Trigger.new){
if(opp.Line_Item__c > 0){
oppids.add(opp.Id);
}
}
List<Opportunity> updatedOpps = [SELECT Id, StageName, Status__c,Partner_Intermediary_PE_Firm_Involved__c, (Select Id, Stage__c,Partner_Intermediary_Involvement__c,Status__c from Opportunity_Service_Line_Items__r) FROM Opportunity WHERE Id in :oppids];
List<Opportunity_Service_Line_Item__c> relatedDealsToUpdate = new List<Opportunity_Service_Line_Item__c>();
for (Opportunity opp : updatedOpps){
for(Opportunity_Service_Line_Item__c rd : opp.Opportunity_Service_Line_Items__r){
rd.Stage__c = opp.StageName;
rd.Status__c = opp.Status__c;
rd.Partner_Intermediary_Involvement__c = opp.Partner_Intermediary_PE_Firm_Involved__c;
relatedDealsToUpdate.add(rd);
}
}
update relatedDealsToUpdate;
}
Please let me know how can i get this trigger fire only once when the object__c record is inserted.
Thanks
I have a master detail relation between Opportunity and object__c(custom object)
I have same stage fields as in opportunity in object__c.
I want to update the stage value from opportunity to object__c only when the object__c record is created. After that the object__c record can have its own stage values different from Opportunity.
I have written the below trigger, but it updates the object__c record everytime there is some update on opportunity, where as i want it to fire only once when the object record is created.
trigger updateLineItemValues on Opportunity (before update){
Set<ID> oppids = new Set<ID>();
for(Opportunity opp : Trigger.new){
if(opp.Line_Item__c > 0){
oppids.add(opp.Id);
}
}
List<Opportunity> updatedOpps = [SELECT Id, StageName, Status__c,Partner_Intermediary_PE_Firm_Involved__c, (Select Id, Stage__c,Partner_Intermediary_Involvement__c,Status__c from Opportunity_Service_Line_Items__r) FROM Opportunity WHERE Id in :oppids];
List<Opportunity_Service_Line_Item__c> relatedDealsToUpdate = new List<Opportunity_Service_Line_Item__c>();
for (Opportunity opp : updatedOpps){
for(Opportunity_Service_Line_Item__c rd : opp.Opportunity_Service_Line_Items__r){
rd.Stage__c = opp.StageName;
rd.Status__c = opp.Status__c;
rd.Partner_Intermediary_Involvement__c = opp.Partner_Intermediary_PE_Firm_Involved__c;
relatedDealsToUpdate.add(rd);
}
}
update relatedDealsToUpdate;
}
Please let me know how can i get this trigger fire only once when the object__c record is inserted.
Thanks
Why are you writing the trigger on Opportunity. You need to write it on Object__c.
You can do like below:
trigger sample on Object__c(before Insert)
{
Set<Id> setOfIds=new Set<ID>();
for(Object__c obj:Trigger.new)
{
setOfIds.add(obj.Opportunity__c);
}
Map<Id,Opportunity> mapOfIdStage=new map<Id,String>([SELECT id,Stage FROM Opportunity WHERE Id IN :setOfIds]);
for(Object__c obj:Trigger.new)
{
obj.Stage__c=mapOfIdStage.get(obj.Opportunity__c).Stage;
}
}
All Answers
Add a static boolean variable to a class, and check its value within the affected triggers.
Example Code Here:
public class HelperClass {
public static boolean firstRun = true;
}
trigger affectedTrigger on Account (before delete, after delete, after undelete) {
if(Trigger.isBefore){
if(Trigger.isDelete){
if(HelperClass.firstRun){
Trigger.old[0].addError('Before Account Delete Error');
HelperClass.firstRun=false;
}
}
}
}
Thanks,
Rockzz
try below Code...
Controller:
public class HelperClass {
public static boolean firstRun = true;
}
Trigger:
trigger updateLineItemValues on Opportunity (before update){
Set<ID> oppids = new Set<ID>();
for(Opportunity opp : Trigger.new){
if(opp.Line_Item__c > 0){
oppids.add(opp.Id);
}
}
List<Opportunity> updatedOpps = [SELECT Id, StageName, Status__c,Partner_Intermediary_PE_Firm_Involved__c, (Select Id, Stage__c,Partner_Intermediary_Involvement__c,Status__c from Opportunity_Service_Line_Items__r) FROM Opportunity WHERE Id in :oppids];
List<Opportunity_Service_Line_Item__c> relatedDealsToUpdate = new List<Opportunity_Service_Line_Item__c>();
if(HelperClass.firstRun){
for (Opportunity opp : updatedOpps){
for(Opportunity_Service_Line_Item__c rd : opp.Opportunity_Service_Line_Items__r){
rd.Stage__c = opp.StageName;
rd.Status__c = opp.Status__c;
rd.Partner_Intermediary_Involvement__c = opp.Partner_Intermediary_PE_Firm_Involved__c;
relatedDealsToUpdate.add(rd);
}
}
update relatedDealsToUpdate;
HelperClass.firstRun=false;
}
}
}
Thanks,
Rockzz
Why are you writing the trigger on Opportunity. You need to write it on Object__c.
You can do like below:
trigger sample on Object__c(before Insert)
{
Set<Id> setOfIds=new Set<ID>();
for(Object__c obj:Trigger.new)
{
setOfIds.add(obj.Opportunity__c);
}
Map<Id,Opportunity> mapOfIdStage=new map<Id,String>([SELECT id,Stage FROM Opportunity WHERE Id IN :setOfIds]);
for(Object__c obj:Trigger.new)
{
obj.Stage__c=mapOfIdStage.get(obj.Opportunity__c).Stage;
}
}
It worked.