我想知道是否有人可以帮我修改这个触发器。我遇到问题机会在关闭/赢取后正在更新,这将覆盖旧的(正确的经理)与当前的经理。这是一个问题,因为我有一个触发器,可以创建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 */
}
}
}
答案 0 :(得分:0)
我不知道为什么这会被标记下来,但是看看它是这样的:
您知道以下内容 -
舞台关闭/赢了 经理领域正在改变
创建声明
的验证规则AND (
ISPICKVAL( StageName , 'Closed/Won' ),
ISCHANGED(Manager__c)
)
基本上,如果舞台处于关闭/赢取且经理已被更改,则此选项将返回true。这将抛出验证规则,防止记录被保存!
希望这有帮助:)
如果您真的想用触发器执行此操作,您可以在更新之前执行此操作,在旧版和新版中检查Opp的阶段,如果阶段没有更改且管理器确实可以简单地替换带有trigger.old值的Trigger.new。可能:)但是在那些Trigger.old / new值中可以修改和不能修改的内容有一些挑剔的规则:)