【发布时间】: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