Помните ATrigger из темы про UT-тесты (https://salesforce-developer.ru/forum/topic-problemy-s-uts-po-mere-rosta-orga-vozrastanie-limitnoi-nagruzki)
Угадайте какая может возникнуть проблема с триггером в котором идёт проверка на изменение поля и обработка в hookFinalize() ?
Помните ATrigger из темы про UT-тесты (https://salesforce-developer.ru/forum/topic-problemy-s-uts-po-mere-rosta-orga-vozrastanie-limitnoi-nagruzki) Угадайте какая может возникнуть проблема с триггером в котором идёт проверка на изменение поля и обработка в hookFinalize() ?
Знаю, что многие знают, но всё же
Trigger.old contains a version of the objects before the specific update that fired the trigger. However, there is an exception. When a record is updated and subsequently triggers a workflow rule field update, Trigger.old in the last update trigger won’t contain the version of the object immediately prior to the workflow update, but the object before the initial update was made. For example, suppose an existing record has a number field with an initial value of 1. A user updates this field to 10, and a workflow rule field update fires and increments it to 11. In the update trigger that fires after the workflow field update, the field value of the object obtained from Trigger.old is the original value of 1, rather than 10, as would typically be the case.
Отсюда последний абзац (за ссылку wilder'у спасибо)
https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_triggers_order_of_execution.htm
Знаю, что многие знают, но всё же Trigger.old contains a version of the objects before the specific update that fired the trigger. However, there is an exception. When a record is updated and subsequently triggers a workflow rule field update, Trigger.old in the last update trigger won’t contain the version of the object immediately prior to the workflow update, but the object before the initial update was made. For example, suppose an existing record has a number field with an initial value of 1. A user updates this field to 10, and a workflow rule field update fires and increments it to 11. In the update trigger that fires after the workflow field update, the field value of the object obtained from Trigger.old is the original value of 1, rather than 10, as would typically be the case. Отсюда последний абзац (за ссылку wilder'у спасибо) https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_triggers_order_of_execution.htm
Интересно, какое значение, из описанного примера, будет в Trigger.new в before и after udapte на первом и втором проходе?
Интересно, какое значение, из описанного примера, будет в Trigger.new в before и after udapte на первом и втором проходе?
Сорри, сам не прочитал.
Trigger.new очевидно будет разным.
Первый проход
Trigger.new {10}, Trigger.old {1}
Второй проход
Trigger.new {11}, Trigger.old {1}
Даже не знаю какие еще варианты у Trigger.new были
Сорри, сам не прочитал. Trigger.new очевидно будет разным. Первый проход Trigger.new {10}, Trigger.old {1} Второй проход Trigger.new {11}, Trigger.old {1} Даже не знаю какие еще варианты у Trigger.new были
очень интересная инфа.
а как это, собственно, конфликтует с логикой тригера, структурированной посредством использования ATrigger?
очень интересная инфа. а как это, собственно, конфликтует с логикой тригера, структурированной посредством использования ATrigger?
Да особо никак, если не учитывать, то что эта проверка не включена из коробки (раз уж у нас ATrigger вроде как отвечает за все случаи).
Конкретно в моём случае появлялись 2 записи в логе вместо одной (свой лог,а не debug log).
Самое простое решение, что я вижу (но не знаю насчет элегантности).
private static Boolean ALLOW_EXECUTION = false;
private static Boolean firstRun = true;
global void execute() {
try {
if (Trigger.isExecuting == true || ALLOW_EXECUTION == true) {
hookInitialize();
if (Trigger.isBefore == true) {
onBefore();
} else if (Trigger.isAfter == true) {
onAfter();
}
hookFinalize();
}
} catch (Exception e) {
hookException(e);
}
updateFirstRun();
}
private void updateFirstRun() {
<логика обновления флага, если подписаны на всё, то проверять если Trigger.isAfter && firstRun>
}
Да особо никак, если не учитывать, то что эта проверка не включена из коробки (раз уж у нас ATrigger вроде как отвечает за все случаи). Конкретно в моём случае появлялись 2 записи в логе вместо одной (свой лог,а не debug log). Самое простое решение, что я вижу (но не знаю насчет элегантности). [code] private static Boolean ALLOW_EXECUTION = false; private static Boolean firstRun = true; global void execute() { try { if (Trigger.isExecuting == true || ALLOW_EXECUTION == true) { hookInitialize(); if (Trigger.isBefore == true) { onBefore(); } else if (Trigger.isAfter == true) { onAfter(); } hookFinalize(); } } catch (Exception e) { hookException(e); } updateFirstRun(); } private void updateFirstRun() { <логика обновления флага, если подписаны на всё, то проверять если Trigger.isAfter && firstRun> } [/code]