You need to sign in to do that
Don't have an account?
Mike Simmen
When Opportunity stage is updated, an Account field is updated
I am somewhat new to Apex Triggers, but I have been working on a way to update the account associated with an opportunity when the stage is updated and a second requirement is met, the closed date (standard opportunity field) is greater than the prospecting date (custom account field). Here is my code. The problem is nothing happens at all and I don't see why. Could you please help. Thanks.
trigger updateAccountProspectStatus on opportunity (after insert, after update){
list<Id> accIds = new list<Id>();
list<Account> accounts = new list<account>();
for(opportunity o:trigger.new){
accIds.add(o.accountId);
}
for(account a:[select Id, Prospecting_Date__c, Prospecting_Status__c, Prospecting_Target__c from account where Id IN :accIds]){
for(opportunity opp:trigger.new){
if(opp.CloseDate >a.Prospecting_Date__c){
if(opp.StageName == 'Qualification/Interest'){
a.Prospecting_Status__c = 'Opportunity Open';
a.Prospecting_Target__c = FALSE;
}
if(opp.StageName == 'Aircraft Info Sent'){
a.Prospecting_Status__c = 'Opportunity Open';
a.Prospecting_Target__c = FALSE;
}
if(opp.StageName == 'Qualification/Interest'){
a.Prospecting_Status__c = 'Opportunity Open';
a.Prospecting_Target__c = FALSE;
}
if(opp.StageName == 'Demo Pending'){
a.Prospecting_Status__c = 'Opportunity Open';
a.Prospecting_Target__c = FALSE;
}
if(opp.StageName == 'Product Presentation Complete-L450/L500'){
a.Prospecting_Status__c = 'Opportunity Open';
a.Prospecting_Target__c = FALSE;
}
if(opp.StageName == 'Demo Completed'){
a.Prospecting_Status__c = 'Opportunity Open';
a.Prospecting_Target__c = FALSE;
}
if(opp.StageName == 'Business Points Negotiated'){
a.Prospecting_Status__c = 'Opportunity Open';
a.Prospecting_Target__c = FALSE;
}
if(opp.StageName == 'Proposal Submitted'){
a.Prospecting_Status__c = 'Opportunity Open';
a.Prospecting_Target__c = FALSE;
}
if(opp.StageName == 'Closed Won'){
a.Prospecting_Status__c = 'Opportunity Closed Won';
a.Prospecting_Target__c = FALSE;
}
if(opp.StageName == 'Closed Lost'){
a.Prospecting_Status__c = 'Opportunity Closed Lost';
a.Prospecting_Target__c = FALSE;
}
if(opp.StageName == 'Closed Drop'){
a.Prospecting_Status__c = 'Opportunity Closed Drop';
a.Prospecting_Target__c = FALSE;
}
}else{
a.Prospecting_Status__c = NULL;
}
}
}
update accounts;
}
trigger updateAccountProspectStatus on opportunity (after insert, after update){
list<Id> accIds = new list<Id>();
list<Account> accounts = new list<account>();
for(opportunity o:trigger.new){
accIds.add(o.accountId);
}
for(account a:[select Id, Prospecting_Date__c, Prospecting_Status__c, Prospecting_Target__c from account where Id IN :accIds]){
for(opportunity opp:trigger.new){
if(opp.CloseDate >a.Prospecting_Date__c){
if(opp.StageName == 'Qualification/Interest'){
a.Prospecting_Status__c = 'Opportunity Open';
a.Prospecting_Target__c = FALSE;
}
if(opp.StageName == 'Aircraft Info Sent'){
a.Prospecting_Status__c = 'Opportunity Open';
a.Prospecting_Target__c = FALSE;
}
if(opp.StageName == 'Qualification/Interest'){
a.Prospecting_Status__c = 'Opportunity Open';
a.Prospecting_Target__c = FALSE;
}
if(opp.StageName == 'Demo Pending'){
a.Prospecting_Status__c = 'Opportunity Open';
a.Prospecting_Target__c = FALSE;
}
if(opp.StageName == 'Product Presentation Complete-L450/L500'){
a.Prospecting_Status__c = 'Opportunity Open';
a.Prospecting_Target__c = FALSE;
}
if(opp.StageName == 'Demo Completed'){
a.Prospecting_Status__c = 'Opportunity Open';
a.Prospecting_Target__c = FALSE;
}
if(opp.StageName == 'Business Points Negotiated'){
a.Prospecting_Status__c = 'Opportunity Open';
a.Prospecting_Target__c = FALSE;
}
if(opp.StageName == 'Proposal Submitted'){
a.Prospecting_Status__c = 'Opportunity Open';
a.Prospecting_Target__c = FALSE;
}
if(opp.StageName == 'Closed Won'){
a.Prospecting_Status__c = 'Opportunity Closed Won';
a.Prospecting_Target__c = FALSE;
}
if(opp.StageName == 'Closed Lost'){
a.Prospecting_Status__c = 'Opportunity Closed Lost';
a.Prospecting_Target__c = FALSE;
}
if(opp.StageName == 'Closed Drop'){
a.Prospecting_Status__c = 'Opportunity Closed Drop';
a.Prospecting_Target__c = FALSE;
}
}else{
a.Prospecting_Status__c = NULL;
}
}
}
update accounts;
}
Try with below code hope it will help you.
Please mark it as best solution to your problem if it does solve your problem.
All Answers
Try with below code hope it will help you.
Please mark it as best solution to your problem if it does solve your problem.
There has to be a check like this -
if(opp.AccountId == a.Id){
// then proceed with other validations.
}
If you want to minimize the number of iterations then you can use a map in stead of iterating over two lists. That will make your code more efficient.
And of course as mentioned by Deepak please use the list of accounts to add the records and then update that list.
Please let me know if this helps or I can provide you with a sample code that will have these implemented.
Thanks,
Kaustav