Привет.
Столкнулся на днях с такой проблемой. Надо реализовать функционал который будет зависеть от изменения email у User. Но вот что получается - если изменить Email у User, то он сразу не меняется, а пользователю отправляется ссылка с подтверждением на новый email. После того как пользователь перейдет по этой ссылке мыло поменяется.
Вот простейший триггер (контакт взят для примера чтобы видеть сработал ли триггер) (! на то что SOQL и DML в for внимания не обращать - так делать нельзя )
trigger UserTrigger on User (after update) {
for (User u : Trigger.new) {
if (u.Email != Trigger.oldMap.get(u.Id).Email) {
Contact c = [SELECT Id, Title FROM Contact WHERE Id = '0039000000PmFYc'];
c.Title = 'YYYYY';
update c;
}
}
}
Так вот он не срабатывает. Т.е. отловить событие о том что Email действительно изменился или нельзя или я что-то не так делаю.
Кто сталкивался, прошу поделиться информацией.
Привет. Столкнулся на днях с такой проблемой. Надо реализовать функционал который будет зависеть от изменения email у User. Но вот что получается - если изменить Email у User, то он сразу не меняется, а пользователю отправляется ссылка с подтверждением на новый email. После того как пользователь перейдет по этой ссылке мыло поменяется. Вот простейший триггер (контакт взят для примера чтобы видеть сработал ли триггер) (! на то что SOQL и DML в for внимания не обращать - так делать нельзя :) ) [code] trigger UserTrigger on User (after update) { for (User u : Trigger.new) { if (u.Email != Trigger.oldMap.get(u.Id).Email) { Contact c = [SELECT Id, Title FROM Contact WHERE Id = '0039000000PmFYc']; c.Title = 'YYYYY'; update c; } } } [/code] Так вот он не срабатывает. Т.е. отловить событие о том что Email действительно изменился или нельзя или я что-то не так делаю. Кто сталкивался, прошу поделиться информацией.
привет! а что говорит дебаг по этому поводу?
я бы так попробовал для начала:
trigger UserTrigger on User (after update) {
for (User u : Trigger.new) {system.debug('XXXXXOld: ' + Trigger.oldMap.get(u.Id).Email);
system.debug('XXXXXNew: ' + u.Email);if (u.Email != Trigger.oldMap.get(u.Id).Email) {
Contact c = [SELECT Id, Title FROM Contact WHERE Id = '0039000000PmFYc'];
c.Title = 'YYYYY';
update c;
} else {
system.debug('XXXXX Something wrong');
}
}
}
а потом и видно будет что там внутри происходит... ;)
привет! а что говорит дебаг по этому поводу? я бы так попробовал для начала: [code]trigger UserTrigger on User (after update) { for (User u : Trigger.new) { system.debug('XXXXXOld: ' + Trigger.oldMap.get(u.Id).Email); system.debug('XXXXXNew: ' + u.Email); if (u.Email != Trigger.oldMap.get(u.Id).Email) { Contact c = [SELECT Id, Title FROM Contact WHERE Id = '0039000000PmFYc']; c.Title = 'YYYYY'; update c; } else { system.debug('XXXXX Something wrong'); } } }[/code] а потом и видно будет что там внутри происходит... ;)
В том то и дело что Email НЕ изменился после вставки в базу.
Распишу немного подробнее.
Для Trigger.isAfter (когда вставка в базу уже произошла):
Trigger.oldMap - состояние объектов до изменения в базе
Trigger.newMap - текущее состояние объектов после изменения в базе
т.е. имеем два состояния базу до и сейчас.
Так вот в базе у нас aaa@mail.com. Мы идем к User (или в коде) и меняем у него Email на bbb@mail.com и сохраняем.
Log триггера показывает что в Trigger.oldMap у нас у пользователя aaa@mail.com (как и должно быть), но и в Trigger.newMap у нас тоже aaa@mail.com (хотя по логике там должен быть bbb@mail.com).
И только после того как пользователь подтвердил изменение в базе данных у пользователя aaa@mail.com поменяется на bbb@mail.com! НО мы об этом НЕ УЗНАЕМ получается? (триггер второй раз не срабатывает)
В том то и дело что Email НЕ изменился после вставки в базу. Распишу немного подробнее. Для Trigger.isAfter (когда вставка в базу уже произошла): Trigger.oldMap - состояние объектов до изменения в базе Trigger.newMap - текущее состояние объектов после изменения в базе т.е. имеем два состояния базу до и сейчас. Так вот в базе у нас aaa@mail.com. Мы идем к User (или в коде) и меняем у него Email на bbb@mail.com и сохраняем. Log триггера показывает что в Trigger.oldMap у нас у пользователя aaa@mail.com (как и должно быть), но и в Trigger.newMap у нас тоже aaa@mail.com (хотя по логике там должен быть bbb@mail.com). И только после того как пользователь подтвердил изменение в базе данных у пользователя aaa@mail.com поменяется на bbb@mail.com! НО мы об этом НЕ УЗНАЕМ получается? (триггер второй раз не срабатывает)
Привет Дима,
На триггере after записи далеко еще не в базе то есть https://www.salesforce.com/us/developer/docs/apexcode/Content/apex_triggers_order_of_execution.htm
я бы попробывал вытащить записи снова в триггер аfter и за update в триггере еще раз user.
[quote="Dmitry Shnyrev"]Привет. Столкнулся на днях с такой проблемой. Надо реализовать функционал который будет зависеть от изменения email у User. Но вот что получается - если изменить Email у User, то он сразу не меняется, а пользователю отправляется ссылка с подтверждением на новый email. После того как пользователь перейдет по этой ссылке мыло поменяется. Вот простейший триггер (контакт взят для примера чтобы видеть сработал ли триггер) (! на то что SOQL и DML в for внимания не обращать - так делать нельзя :) ) [code] trigger UserTrigger on User (after update) { for (User u : Trigger.new) { if (u.Email != Trigger.oldMap.get(u.Id).Email) { Contact c = [SELECT Id, Title FROM Contact WHERE Id = '0039000000PmFYc']; c.Title = 'YYYYY'; update c; } } } [/code] Так вот он не срабатывает. Т.е. отловить событие о том что Email действительно изменился или нельзя или я что-то не так делаю. Кто сталкивался, прошу поделиться информацией.[/quote] Привет Дима, На триггере after записи далеко еще не в базе то есть [url]https://www.salesforce.com/us/developer/docs/apexcode/Content/apex_triggers_order_of_execution.htm[/url] я бы попробывал вытащить записи снова в триггер аfter и за update в триггере еще раз user.
А тригер не срабатывает, когда пользователь делает активацию нового емэйла?
А тригер не срабатывает, когда пользователь делает активацию нового емэйла?
В том то и дело что 5 пункт - это то что уже в базе, а на 17 изменения либо подтверждаются, либо отменяются (в случае появления ошибки). Сами данные с 5 по 17 пункт уже не меняются. Коммит это всего лишь подтверждение того что записано в базу.
А по поводу вытащить заново или в триггере или потом - пока не подтвердишь по ссылке будет возвращать старый email, как будто ты ничего и не делал. Я могу хоть через неделю подтвердить и только тогда в базе появится новый email.
Вот такой парадокс :)
[quote]На триггере after записи далеко еще не в базе то есть [url]https://www.salesforce.com/us/developer[/url] ... cution.htm[/quote] из документа [quote] ... 3. Executes all before triggers. ... 5. Saves the record to the database, but doesn't commit yet. 6. Executes all after triggers. ... 17. Commits all DML operations to the database. [/quote] В том то и дело что 5 пункт - это то что уже в базе, а на 17 изменения либо подтверждаются, либо отменяются (в случае появления ошибки). Сами данные с 5 по 17 пункт уже не меняются. Коммит это всего лишь подтверждение того что записано в базу. А по поводу вытащить заново или в триггере или потом - пока не подтвердишь по ссылке будет возвращать старый email, как будто ты ничего и не делал. Я могу хоть через неделю подтвердить и только тогда в базе появится новый email. Вот такой парадокс :)
тогда можно сделать батч.. и заскедулить его
тогда можно сделать батч.. и заскедулить его
Согласен. Пока это единственный рабочий вариант.
[quote="alex_flx"]тогда можно сделать батч.. и заскедулить его[/quote] Согласен. Пока это единственный рабочий вариант.
как будет готово: дайте код этого батч класса.
и в батче немного разберусь, и посмотрю как вы будите в батче изменения емэйла ловить...
как будет готово: дайте код этого батч класса. и в батче немного разберусь, и посмотрю как вы будите в батче изменения емэйла ловить...
еще есть мысль завязать это дело не на батч, а на workflow rules..
еще есть мысль завязать это дело не на батч, а на workflow rules..
Завязывал на workflow rule. Тоже самое! Хотя это логично - workflow это тот же триггер, только его можно, грубо говоря, задать мышкой. (это конечно не касается time-based workflow )
Завязывал на workflow rule. Тоже самое! Хотя это логично - workflow это тот же триггер, только его можно, грубо говоря, задать мышкой. (это конечно не касается time-based workflow :) )
Есть такая идея у нас есть возможность отслеживать что бы не был запущен батч два раза и проверять последнию модефикацию юзера по дате.Дальше можно шедуллер запускать каждые 10 минут.И проверят были ли изменения.
Есть такая идея у нас есть возможность отслеживать что бы не был запущен батч два раза и проверять последнию модефикацию юзера по дате.Дальше можно шедуллер запускать каждые 10 минут.И проверят были ли изменения.
Да, Сергей это логично. Это уже детали реализации. Пока порешили на том, что связывание по Email плохая идея и переделали на использование Lookup. Проблема со связью ушла, но проблема с email осталась, что уже не так критично как было Спасибо за участие в обсуждении.
Да, Сергей это логично. Это уже детали реализации. Пока порешили на том, что связывание по Email плохая идея и переделали на использование Lookup. Проблема со связью ушла, но проблема с email осталась, что уже не так критично как было :) Спасибо за участие в обсуждении.