修改机会触发器,以便在管理员已关闭/赢取时不会更新管理器

时间:2012-10-23 21:17:04

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

我想知道是否有人可以帮我修改这个触发器。我遇到问题机会在关闭/赢取后正在更新,这将覆盖旧的(正确的经理)与当前的经理。这是一个问题,因为我有一个触发器,可以创建Actuals并编辑Actuals并为当前Manager而不是旧Manager编写它们。我真的很困惑,编辑它的最佳位置是,如果在触发器旧映射中StageName为Closed / Won并且StageName当前等于Closed / Won,那么在if语句put和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 */        

  }
}

 }

1 个答案:

答案 0 :(得分:0)

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

您知道以下内容 -

舞台关闭/赢了 经理领域正在改变

创建声明

的验证规则
AND ( 
  ISPICKVAL( StageName , 'Closed/Won' ),
  ISCHANGED(Manager__c)
)

基本上,如果舞台处于关闭/赢取且经理已被更改,则此选项将返回true。这将抛出验证规则,防止记录被保存!

希望这有帮助:)

如果您真的想用触发器执行此操作,您可以在更新之前执行此操作,在旧版和新版中检查Opp的阶段,如果阶段没有更改且管理器确实可以简单地替换带有trigger.old值的Trigger.new。可能:)但是在那些Trigger.old / new值中可以修改和不能修改的内容有一些挑剔的规则:)