【问题标题】:Salesforce bulkify code - is this not already bulkified?Salesforce 批量化代码 - 这不是已经批量化了吗?
【发布时间】:2014-07-18 18:45:47
【问题描述】:

我们在 salesforce 中有一个类,称为触发器。使用 Apex 数据加载器时,此触发器会引发错误 oppafterupdate: System.LimitException: Too many SOQL queries: 101

我注释掉了在我们编写的类中调用以下静态方法的一行代码,并且没有更多关于管理限制的错误。所以我可以验证下面的方法是罪魁祸首。

我是新手,但我知道 Apex 代码应该被批量化,并且 DML(和 SOQL)语句不应该在循环内使用。您要做的是将对象放入一个集合中,并针对该集合使用 DML 语句。

所以我修改了下面的方法;我声明了一个列表,将 Task 对象添加到列表中,并在列表上运行了 DML 语句。我在循环中注释掉了更新语句。

 //close all tasks linked to an opty or lead
     public static void closeTasks(string sId) {
         List<Task> TasksToUpdate = new List<Task>{}; //added this
         List<Task> t = [SELECT Id, Status, WhatId from Task WHERE WhatId =: sId]; //opty
         if (t.isEmpty()==false) {
             for (Task c: t) {
                 c.Status = 'Completed';
                 TasksToUpdate.add(c);  //added this
                 //update c;
             }
         }
         update TasksToUpdate;  //Added this
     }

为什么我在沙箱中运行代码时仍然出现上述错误?我以为我已经解决了这个问题,但显然这里还有其他问题?请帮助..我需要指出正确的方向。

提前感谢您的帮助

【问题讨论】:

  • 这里更新了多少任务?
  • 没有真正的方法可以判断,因为您无法“逐步执行代码”。我正在通过 apex 数据加载器批量更新机会,而关闭的机会需要关闭他们的任务。这是一个 1:M 的关系,所以实际数字可能相当高
  • 没错,你不能单步执行,但是有一个日志文件。尝试添加“system.debug('# of tasks' + TasksToUpdate.size());”然后检查日志。
  • 好的,捷豹,谢谢。我现在明白发生了什么。正如下面提到的眼霜,我只解决了一半的问题。我仍然习惯于在无法单步执行代码的情况下进行调试,所以我很感激提醒我改变思维方式

标签: for-loop triggers salesforce apex bulk


【解决方案1】:

您已经“修复”了更新部分,但代码在太多 SELECT 上仍然失败。

我们需要查看您的触发器的代码,但在我看来,您是在该触发器的循环中调用您的函数。因此,如果说更新了 200 个机会,您的函数被调用了 200 次,并且在函数体内您有 1 个 SOQL...调用它超过 100 次,然后轰隆隆,爆头。

尝试修改函数以传递一组Ids:

Set<Id> ids = trigger.newMap().keyset();
betterCloseTasks(ids);

改进后的功能可能是这样的:

public static void betterCloseTasks(Set<Id> ids){
    List<Task> tasksToClose = [SELECT Id
        FROM Task
        WHERE WhatId IN :ids AND Status != 'Completed'];

    if(!tasksToClose.isEmpty()){
        for(Task t : tasksToClose){
            t.Status = 'Completed';
        }
        update tasksToClose;
    }
}

现在无论您更新 1 个还是数百个机会,您都有 1 个 SOQL 和 1 个更新操作。它仍然可能在其他一些限制上失败,例如在一次交易中最多更新 10000 条记录,但这是另一天的战斗;)

【讨论】:

  • 你说得对,我是通过触发器中的循环调用该方法。很好的提醒,治理限制涵盖所有 SOQL 查询,而不仅仅是更新。谢谢你,感谢你的提醒。
猜你喜欢
  • 1970-01-01
  • 2019-01-13
  • 2019-11-13
  • 1970-01-01
  • 2018-04-09
  • 2021-01-28
  • 1970-01-01
  • 2020-02-25
  • 2021-07-14
相关资源
最近更新 更多