这是挑战:
要完成此挑战,您需要为Opportunity添加触发器。触发器将向任何插入或更新“Closed Won”阶段的机会添加任务。任务的主题必须是“跟进测试任务”。
这是我的代码
trigger ClosedOpportunityTrigger on Opportunity (before insert, before update) {
List<Opportunity> opportunities = [SELECT Id, StageName
FROM Opportunity
WHERE Id
IN :Trigger.New];
List<Task> tasksToUpdate = new List<Task>();
System.debug('##### OPS' + opportunities);
for(Opportunity o : opportunities){
System.debug('##### ' + o.StageName);
if(o.StageName == 'Closed Won'){
Task thisTask = new Task(WhatId = o.Id, Subject = 'Follow Up Test Task');
tasksToUpdate.add(thisTask);
System.debug('##### ' + tasksToUpdate);
}
}
insert tasksToUpdate;
}
当我尝试通过trailhead进行验证时,它会给出一个“挑战尚未完成......这里有什么问题: 对触发器执行不能按预期工作。“错误。
我添加了一些调试打印,它似乎表明soql语句不会提取任何结果,因此它不会输入if语句。对我来说这似乎是一个非常简单的soql声明,但我必须遗漏一些东西。无论我是否添加或更新项目,都会发生这种情况。
提前致谢
答案 0 :(得分:1)
在Trigger上下文中,您不需要使用SOQL查询来检索正在插入或更新的记录。
此外,通过before insert
触发器,记录不会在数据库中,因此他们不会定义任何ID。这就是查询没有返回任何内容的原因。
相反,您需要使用Trigger Context Variables来处理记录。
特别是,您可以使用Trigger.new
来获取插入或更新的记录集合。尝试循环遍历此集合,而不是在触发器中使用SOQL查询。
答案 1 :(得分:0)
您的代码的问题在于您在插入/更新之前运行,其中元素还没有ID。因此以下代码:
Task thisTask = new Task(WhatId = o.Id, Subject = 'Follow Up Test Task');
插入一个没有通过测试的空WhatId的任务。只需在插入/更新触发事件后更改为。
答案 2 :(得分:0)
好吧,由于任务问题,我遇到了这个挑战的麻烦,似乎它只是salesforce的默认对象!
您的问题是,您的代码不会像跟踪中显示的那样充足。
trigger ClosedOpportunityTrigger on Opportunity (after insert, after update) {
List<Opportunity> closedOpp = [Select id from opportunity
where id IN :Trigger.New
AND StageName = 'Closed Won'];
List<Task> triggeredTasks = new List<Task>();
for (Opportunity o : closedOpp){
Task tache = new Task (Subject = 'Follow Up Test Task',
WhatId = o.ID);
triggeredTasks.add(tache);
}
insert triggeredTasks;
}
答案 3 :(得分:0)
这里的代码有效:
触发Opportunity上的ClosedOpportunityTrigger(插入后,更新后){
List<Task> OpTasklist = new List<Task>();
// Iterate over opportunities that are in this trigger and have a stage of "Closed Won"
for (Opportunity op: [SELECT id FROM Opportunity
WHERE Id IN :Trigger.New AND
StageName =: 'Closed Won']) {
if ((Trigger.IsUpdate && Trigger.oldMap.get(op.Id).StageName != 'Closed Won')) OR
(Trigger.IsInsert) {
OpTaskList.add(new Task (Subject='Follow Up Test Task',
WhatId = op.Id)); }
}
If (OpTaskList.size() > 0) {
Insert OpTaskList ;
}
}
答案 4 :(得分:0)
trigger ClosedOpportunityTrigger on Opportunity (after insert, after update) {
List<Task> taskListToInsert = new List<Task>();
for(Opportunity opp : [Select Id,StageName from Opportunity
where Id in :Trigger.New AND StageName = 'Closed Won'])
{
taskListtoInsert.add(new Task(Subject ='Follow Up Test Task',WhatId = opp.Id));
}
if(taskListtoInsert.size()>0)
{
insert taskListtoInsert;
}
}
答案 5 :(得分:0)
触发 ClosedOpportunityTrigger on Opportunity(插入后,更新后){
List oppty = [Select id from chance where id IN :Trigger.New AND StageName = 'Closed Won'];
List<Task> new_task = new List<Task>();
for (Opportunity opp : oppty){
Task thistask = new Task (Subject = 'Follow Up Test Task',WhatId = opp.ID);
new_task.add(thistask);
}
insert new_task;
}