ОБНОВЛЕНИЕ Я поставил это на AfterUpdate вместо Before, и это работает!

Зачем?


Ошибка кажется достаточно понятной, но я не могу понять, почему Salesforce говорит, что это происходит.

У меня есть код для выполнения в «BeforeUpdate», который определяет, был ли только что изменен флажок с неотмеченного на отмеченный. Если это так, он запускает некоторую логику, включая создание и OrderItem (с идентификатором триггерного заказа в качестве его родителя). Я не вставляю этот Order (что имело бы смысл вызвать эту ошибку), я просто вставляю OrderItem, который ссылается на Order как на своего родителя. Это приводит...

SELF_REFERENCE_FROM_TRIGGER, Объект (id = 8012a000000UTdz) в настоящее время находится в триггере OrderTrigger, поэтому он не может рекурсивно обновлять себя: []

Этот идентификатор на самом деле является идентификатором Ордена, вызвавшего триггер, но я нигде его не обновляю - строка, которая вызывает эту ошибку и смягчает ее при комментировании, выглядит так:

Вставьте newOrderItems, который содержит OrderItem с 8012a000000UTdz в качестве родителя.

Может ли кто-нибудь объяснить, почему это происходит, и, возможно, подтвердить, возможно ли создать OrderItem для этого триггера?

1
Natalie Paige 5 Июн 2018 в 00:59

1 ответ

Лучший ответ

Это происходит из-за сводной логики свертки; когда вы создаете позиции, он пытается обновить сводные значения заказа, но в настоящее время он находится в триггере before DML (не зафиксирован в базе данных), что вызывает ошибку. Как вы поняли, переход к триггеру AfterUpdate исправляет ситуацию, потому что запись больше не блокируется, чтобы могло произойти обновление. Это ограничение существует, потому что триггеры before могут изменять данные перед фиксацией записи, поэтому, если бы ему было разрешено снова обновлять себя, эти значения могли бы быть перезаписаны при повторной фиксации из другого триггера, находящегося выше по стеку.

0
sfdcfox 5 Июн 2018 в 01:16
Я не уверен, что понимаю. Меня смущает то, что я никогда не обновляю Order в этой логике, просто вставляю OrderItem. Ваш ответ в основном говорит о том, что действие добавления OrderItem «обновляет» Order в том, что связанный список теперь заполняется по-другому? Это считается обновлением? Как я это вижу, список просто динамически извлекает заказы по OrderId - действительно ли это элемент, который обновляется?
 – 
Natalie Paige
5 Июн 2018 в 01:26
1
Вы захотите увидеть триггеры и порядок Исполнение. Во время транзакции есть часть, где вычисляются сводные значения сводки, таким образом неявно обновляя заказ. Также обратите внимание, что это означает, что вам нужно быть осторожным при написании своих триггеров, потому что это может вызвать бесконечный цикл, который приведет к LimitException.
 – 
sfdcfox
5 Июн 2018 в 01:33