我在Trailhead challenge Developer Beginner上的代码有什么问题> Apex触发器> Bulk Apex触发器

时间:2016-02-15 17:30:16

标签: salesforce apex

这是挑战:

要完成此挑战,您需要为Opportunity添加触发器。触发器将向任何插入或更新“Closed Won”阶段的机会添加任务。任务的主题必须是“跟进测试任务”。

  • Apex触发器必须称为“ClosedOpportunityTrigger”
  • 当'ClosedOpportunityTrigger'处于活动状态时,如果插入或更新了一个'Closed Won'阶段的机会,它将使用主题'跟进测试任务'创建一个任务。
  • 要将任务与商机相关联,请使用商机ID填写“WhatId”字段。
  • 此挑战专门在一次操作中测试200条记录。

这是我的代码

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声明,但我必须遗漏一些东西。无论我是否添加或更新项目,都会发生这种情况。

提前致谢

6 个答案:

答案 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 St​​ageName = '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;

}