Salesforce Trailhead challenge Developer初学者>Apex触发器>批量Apex触发器上的代码有什么问题

Salesforce Trailhead challenge Developer初学者>Apex触发器>批量Apex触发器上的代码有什么问题,salesforce,apex,Salesforce,Apex,这就是挑战: 要完成此挑战,您需要为Opportunity添加触发器。触发器将向插入或更新的任何opportunity添加一项任务,该opportunity的阶段为“Closed Won”。任务的主题必须是“后续测试任务” Apex触发器必须称为“ClosedOpportunityTrigger” 在“ClosedOpportunityTrigger”处于活动状态的情况下,如果插入或更新了“Closed Won”阶段的opportunity,则该opportunity将创建一个任务,主题为“跟进

这就是挑战:

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

Apex触发器必须称为“ClosedOpportunityTrigger” 在“ClosedOpportunityTrigger”处于活动状态的情况下,如果插入或更新了“Closed Won”阶段的opportunity,则该opportunity将创建一个任务,主题为“跟进测试任务”。 要将任务与opportunity关联,请使用opportunity 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语句,但我肯定遗漏了什么。无论我是否添加或更新项目,都会发生这种情况


提前感谢

在触发器上下文中,您不需要使用SOQL查询来检索正在插入或更新的记录

此外,使用before insert触发器,记录还不会在数据库中,因此它们不会定义任何Id。这就是为什么查询没有返回任何内容

相反,您将希望使用来处理记录


特别是,您可以使用Trigger.new来获取正在插入或更新的记录集合。尝试在该集合上循环,而不是在触发器中使用SOQL查询。

代码的问题是,您在插入/更新之前运行的元素还没有ID。因此,以下代码:

Task thisTask = new Task(WhatId = o.Id, Subject = 'Follow Up Test Task');

插入一个WhatId为空且未通过测试的任务。只需更改为after insert/after update the trigger event。

好吧,由于任务的原因,我遇到了这个问题,似乎它只是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;
}

下面是有效的代码:


在插入后、更新后在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 ;
}   

}

在插入后、更新后触发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 ;
}   
List oppty=[从opportunity中选择id,其中id位于:Trigger.New和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;

}

虽然这段代码可能会回答这个问题,但提供关于它如何以及为什么解决这个问题的附加上下文将提高答案的长期价值。我也尝试过其他一些方法,但是我看到当你使用列表上的查询时,直接声明你需要最新的记录,包括stage name as closed won,这给了你答案。托努