Регистрация  |  Вход

Вопрос по старым статьям

У меня вопрос по статье 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-ом у другого пользователя созданного ранее, т.е. как определить именно последний объект".

Спасибо.

mik
У меня вопрос по статье [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/

mik
Спасибо, я к этому уже пришел. Наткнулся на подобный вопрос уже позже на форуме: 
[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]