У меня вопрос по статье http://salesforce-developer-rus.blogspot.ru/2012/12/apex-triggers-salesforce.html?showComment=1367845710448#c2379157175819499941 возник, я тут продублировал комментарий свой.
Был триггер,
trigger checkEmail on Contact (before insert) {
for (Contact c : Trigger.new) {
if (c.Email == null) {
c.Email.addError('Please enter email');
}
}
}
Конструкция Trigger.new, как я понимаю, представляет все существующие объекты Contact , включая создаваемый.
В связи с чем, я не понимаю как поступить, если например встанет задача: "нельзя добавить email, если он совпадает с каким-нибудь email-ом у другого пользователя созданного ранее, т.е. как определить именно последний объект".
Спасибо.
У меня вопрос по статье [url]http://salesforce-developer-rus.blogspot.ru/2012/12/apex-triggers-salesforce.html?showComment=1367845710448#c2379157175819499941[/url] возник, я тут продублировал комментарий свой. Был триггер, [code]trigger checkEmail on Contact (before insert) { for (Contact c : Trigger.new) { if (c.Email == null) { c.Email.addError('Please enter email'); } } } [/code] Конструкция Trigger.new, как я понимаю, представляет все существующие объекты Contact , включая создаваемый. В связи с чем, я не понимаю как поступить, если например встанет задача: "нельзя добавить email, если он совпадает с каким-нибудь email-ом у другого пользователя созданного ранее, т.е. как [b]определить именно последний объект[/b]". Спасибо.
Привет mik.
Спасибо за вопрос. Постараюсь объяснить.
"Конструкция Trigger.new, как я понимаю, представляет все существующие объекты Contact , включая создаваемый." - не совсем верно.
Trigger.new - это List объектов которые попали в trigger из DML операции (insert, update, delete, upsert - в эти команды можно подставлять как отдельный объект, так и список объектов).
В 90% случаев Trigger.new будет состоять из 1 записи, НО программировать триггер надо с расчетом что в него может попасть сразу пачка объектов. Поэтому главным циклом в триггере будет перебор объектов из Trigger.new (Trigger.old).
Теперь по первой части вопроса "нельзя добавить email, если он совпадает с каким-нибудь email-ом у другого пользователя созданного ранее" - я бы сделал так:
1. первый цикл по Trigger.new - выбрал в List<String> все email адреса из всех пришедших Contacts (обычно это будет 1 запись, но как я объяснил выше мы сразу рассчитываем на пачку)
2. сделал SOQL запрос на поиск существующих контактов у которых email IN наш лист адресов что мы собрали ранее.
3. проверил, если запрос вернет хотя бы один контакт с таким адресом - генерируем ошибку.
!Важно также понимать, что если хотя бы одна запись будет ошибочна, то вся пачка не сохранится.
Что касается последней части вопроса - если в триггер приходит одна запись (обычно в результате ручного создания контакта) все отработает правильно - пользователь получит ошибку на экран. Но если придет пачка (обычно автоматическая генерация контактов сразу пачками) и хотя бы один контакт неправильный, то вся пачка вылетит а как вы обработаете эту ситуацию уже зависит от логики приложения.
Привет mik. Спасибо за вопрос. Постараюсь объяснить. "[i]Конструкция Trigger.new, как я понимаю, представляет все существующие объекты Contact , включая создаваемый.[/i]" - не совсем верно. Trigger.new - это List объектов которые попали в trigger из DML операции (insert, update, delete, upsert - в эти команды можно подставлять как отдельный объект, так и список объектов). В 90% случаев Trigger.new будет состоять из 1 записи, НО программировать триггер надо с расчетом что в него может попасть сразу пачка объектов. Поэтому главным циклом в триггере будет перебор объектов из Trigger.new (Trigger.old). Теперь по первой части вопроса "[i]нельзя добавить email, если он совпадает с каким-нибудь email-ом у другого пользователя созданного ранее[/i]" - я бы сделал так: 1. первый цикл по Trigger.new - выбрал в List<String> все email адреса из всех пришедших Contacts (обычно это будет 1 запись, но как я объяснил выше мы сразу рассчитываем на пачку) 2. сделал SOQL запрос на поиск существующих контактов у которых email IN наш лист адресов что мы собрали ранее. 3. проверил, если запрос вернет хотя бы один контакт с таким адресом - генерируем ошибку. !Важно также понимать, что если хотя бы одна запись будет ошибочна, то вся пачка не сохранится. Что касается последней части вопроса - если в триггер приходит одна запись (обычно в результате ручного создания контакта) все отработает правильно - пользователь получит ошибку на экран. Но если придет пачка (обычно автоматическая генерация контактов сразу пачками) и хотя бы один контакт неправильный, то вся пачка вылетит а как вы обработаете эту ситуацию уже зависит от логики приложения.
Спасибо, я к этому уже пришел. Наткнулся на подобный вопрос уже позже на форуме:
http://shivasoft.in/blog/salesforce/step-by-step-salesforce-tutorial-%e2%80%93-creating-trigger-and-test-cases-%e2%80%93-6-of-6/
Спасибо, я к этому уже пришел. Наткнулся на подобный вопрос уже позже на форуме: [url]http://shivasoft.in/blog/salesforce/step-by-step-salesforce-tutorial-%e2%80%93-creating-trigger-and-test-cases-%e2%80%93-6-of-6/[/url]