-1

誰かがこのトリガーを変更するのを手伝ってくれるかどうか疑問に思っていました. 商談が成立/成立した後に更新され、古い (正しいマネージャー) が担当者の現在のマネージャーで上書きされるという問題があります。これは、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 */        

  }
}

 }
4

1 に答える 1

0

なぜこれがマークダウンされたのかわかりませんが、次のように見てください。

あなたは次のことを知っています -

ステージは終了/勝利 マネージャー フィールドが変更されます

次の検証ルールを作成します。

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

基本的に、ステージがクローズ/ウォンで、マネージャーが変更された場合、これは true を返します。これにより、検証ルールがスローされ、レコードが保存されなくなります。

お役に立てれば :)

本当にトリガーを使用してこれを実行したい場合は、更新前に行うことができます。古いものと新しいものの両方で Opp のステージを確認し、ステージが変更されず、マネージャーが変更した場合は、単にトリガーを置き換えることができます。新しい、trigger.old 値。おそらく:)しかし、これらのTrigger.old/new値で変更できるものとできないものについては、いくつかの厄介なルールがあります:)

于 2012-10-25T23:56:47.520 に答える