【问题标题】:Modifying a Trigger for Opportunity so it will not update Manager if's it's been Closed/Won修改机会的触发器,使其不会更新经理,如果它已被关闭/赢得
【发布时间】:2012-10-23 21:17:04
【问题描述】:

我想知道是否有人可以帮助我修改此触发器。我遇到问题 机会在关闭/赢得后正在更新,这会用代表的当前经理覆盖旧的(正确的经理)。这是一个问题,因为我有一个创建 Actuals 的触发器,它正在编辑 Actuals 并将它们写入当前 Manager 而不是旧 Manager。我真的很困惑最好的编辑位置在哪里,如果在触发器旧地图中 StageName 是 Closed/Won 并且 StageName 目前等于 Closed/Won,则在 if 语句放置和 ifelse 语句开始之后的底部,然后不要'不更新当前实际值。这是触发器:

trigger CreateActualsAndTargets on Opportunity (after insert, after update) 
{
if(Trigger.isUpdate || Trigger.isInsert)   
{
  Map<ID,Opportunity> l_OpportunityOwners = new Map<ID,Opportunity> ([Select id,o.Owner.ManagerId,Contract_ID__c,StageName,Amount,AccountId,CloseDate, o.OwnerId, Type From Opportunity o where id in:trigger.newMap.keySet()]);
  GooalAndActuals l_oGooalAndActuals = new GooalAndActuals ();

  for(Opportunity l_oOpportunityNew:l_OpportunityOwners.values())
  {
    System.debug('********************Trigger Start***********************');
    if(l_oOpportunityNew.StageName=='Closed/Won')
    {
      ID SalesRepGoalID,ManagerGoalID;
      //modified
      l_oGooalAndActuals = new GooalAndActuals ();
      l_oGooalAndActuals.opportunityNew=l_oOpportunityNew;


      //Goal Creation
      SalesRepGoalID=l_oGooalAndActuals.CreateGoal(l_oOpportunityNew.OwnerId);//SalesRep Goal Creation
      if(l_oOpportunityNew.Owner.ManagerId!= null)
      {
        ManagerGoalID=l_oGooalAndActuals.CreateGoal(l_oOpportunityNew.Owner.ManagerId);//Manager Goal Creation
      }


      //Actual Deletion
      if(Trigger.isUpdate)
      {
        l_oGooalAndActuals.DeleteActual(l_oOpportunityNew.Id);

      }

      //Actual Creation
      l_oGooalAndActuals.CreateActual(l_oOpportunityNew.OwnerId,SalesRepGoalID);//SalesRep Actual Creation
      if(l_oOpportunityNew.Owner.ManagerId!= null)
      {
        l_oGooalAndActuals.CreateActual(l_oOpportunityNew.Owner.ManagerId,ManagerGoalID);//Manager Actual Creation
      }



    }

    /*
    Start: Project
    *   Author          |Author-Email            |Date       |Comment
    *   ----------------|------------------------|-----------|--------------------------------------------------
    *   Sakonent Admin  |abrar.haq@sakonent.com  |02.16.2012 |Initial code 
    *   Purpose: It will remove Actual record(s) associated to Opportunity if Stage goes from 'Closed/Won' to some other stage.
    */        
    else if(Trigger.isUpdate)
    {
        if(Trigger.oldMap.get(l_oOpportunityNew.Id).StageName == 'Closed/Won' && l_oOpportunityNew.StageName != 'Closed/Won')
        {
            l_oGooalAndActuals = new GooalAndActuals ();
            l_oGooalAndActuals.opportunityNew=l_oOpportunityNew;
            l_oGooalAndActuals.DeleteActual(l_oOpportunityNew.Id);
        }
    }
    /*End: Project */        

  }
}

 }

【问题讨论】:

    标签: salesforce apex-code salesforce-service-cloud


    【解决方案1】:

    我不知道为什么会被标记下来,但是这样看:

    你知道以下 -

    关卡/获胜 经理字段正在更改

    创建一个声明的验证规则

    AND ( 
      ISPICKVAL( StageName , 'Closed/Won' ),
      ISCHANGED(Manager__c)
    )
    

    基本上,如果阶段处于关闭/获胜状态并且经理已更改,这将返回 true。这将抛出阻止记录被保存的验证规则!

    希望这会有所帮助:)

    如果你真的想用触发器做到这一点,你可以做一个更新前,检查旧的和新的 Opp 的阶段,如果阶段没有改变并且经理做了你可以简单地替换带有 trigger.old 值的 Trigger.new。可能 :) 但是有一些关于在这些 Trigger.old/new 值中可以修改和不能修改的规则:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      相关资源
      最近更新 更多