我正在尝试触发机会,以便在机会的pricebook2id字段中获得价目表名称?你能帮我吗?
trigger Oppor on Opportunity (before insert, before update) {
if(trigger.isInsert || trigger.isUpdate){
List<Opportunity> oppList = new List<Opportunity>();
Set<Id> setId=new Set<Id>();
for(Opportunity o:Trigger.new)
{
setId.add(o.AccountId);
}
system.debug(setId);
oppList = [Select Id, Name, Opportunity.Account.Name,
Opportunity.Account.BillingCity from Opportunity where AccountId=: setId ];
system.debug(oppList);
List<Pricebook2> PB=new List<Pricebook2>();
PB =[select id from Pricebook2 where Name =:'Rick' ];
for(pricebook2 pc : PB)
{
for(Opportunity Op : oppList)
{
for(Opportunity Opp : trigger.new)
{
if(Op.Account.BillingCity == 'Slo')
{
Opp.Pricebook2Id = pc.Id;
}
}
}
}
}
答案 0 :(得分:0)
PB =[select id from Pricebook2 where Name =:'Rick' ];
for(pricebook2 pc : PB)
{
for(Opportunity Op : oppList)
{
for(Opportunity Opp : trigger.new)
{
if(Op.Account.BillingCity == 'Slo')
{
Opp.Pricebook2Id = pc.Id;
}
}
}
}
对不起,我不了解此代码。您正在遍历所有返回的价目表,然后遍历通过查询返回的所有机会,然后遍历查询中的所有机会,并且如果查询列表中的当前机会具有特定的开票城市,然后将触发器中的所有记录更新为当前价格表值。似乎没有逻辑。您似乎并不在乎查询中返回的机会是否与触发器中要更新的机会相同。
想象一下,您的价目表列表包含2条记录,您的opps查询包含3条均以“ Slo”为城市的记录,而触发器包含1条记录。
因此,您的循环从第一本价格手册开始, 然后,它将遍历触发器中的所有3条记录,并且由于它们都具有所在城市的位置,因此它将1条触发器记录更改为第一个价目表3次。然后它将开始第二个价目表记录。它将再次遍历所有3个查询的操作,并再次将1个触发记录更新3次至第二个价格手册ID。
我不确定您的意图是什么。如果您假设只有一个价目表条目带有名称rick,然后要查找当前触发记录是否具有“ Slo”帐户,则需要在更新之前将查询的记录与正确的触发记录进行匹配。
如果您只有一个价格记录记录,并且想要确定触发记录帐户是否为“ slo”,请执行此操作。
编辑:在代码示例中修复了一些打字错误
Map<id, Account> mapAccounts = new map<id,Account> ([Select id, BillingCity from
Account where id in: setId]);
PB =[select id from Pricebook2 where Name =:'Rick' ]; //(Assume only 1)
for(Opportunity opp: trigger.new)
{
if(mapAccounts.get(opp.AccountId).BillingCity == 'Slo')
{
opp.Pricebook2Id =PB[0].ID;
}
}