Есть следующая "ерархия" объектов:
Opportunity > Project > CreativeRequest
Для СreativeRequest существует триггер (insert, update, delete)
Если срабатывает тригер то мы получаем нужную инфу - поля CreativeRequest + вытаскиваем по цепочке opportunity Id
Как бы все хорошо, но есть одна ситуация когда плохо.
Cодаем project_test который не привязываем к opportunity. Потом создаем CreativeRequest_test который привязываем к project_test.
Соответственно сработает триггер и мы получим поля CreativeRequest_test, подтягиваем opportunity Id и там пусто.
Ну как бы все логично.
А теперь заходим в project_test и привызываем его к какому нибудь opportunity. Тригер не срабатывает соответственно данные CreativeRequest_test изменились но не попали к нам.
Нельзя навесить какой-то тригер который дернет существующий. Или надо писать отдельный для Project в котором доставать все приасайненые CreativeRequest и уже по их id получать все что нам надо?
Есть следующая "ерархия" объектов: Opportunity > Project > CreativeRequest Для СreativeRequest существует триггер (insert, update, delete) Если срабатывает тригер то мы получаем нужную инфу - поля CreativeRequest + вытаскиваем по цепочке opportunity Id Как бы все хорошо, но есть одна ситуация когда плохо. Cодаем project_test который не привязываем к opportunity. Потом создаем CreativeRequest_test который привязываем к project_test. Соответственно сработает триггер и мы получим поля CreativeRequest_test, подтягиваем opportunity Id и там пусто. Ну как бы все логично. А теперь заходим в project_test и привызываем его к какому нибудь opportunity. Тригер не срабатывает соответственно данные CreativeRequest_test изменились но не попали к нам. Нельзя навесить какой-то тригер который дернет существующий. Или надо писать отдельный для Project в котором доставать все приасайненые CreativeRequest и уже по их id получать все что нам надо?
Во-первых связь "наоборот" (в другую сторону)
CreativeRequest -> Project -> Opportunity ("->" означает ссылается)
Да, все правильно - триггер не сработает, потому что поменялся Project, а не CreativeRequest.
Надо повесить триггер еще на Project, который, будет отсылать данные точно также как и триггер CreativeRequest
Во-первых связь "наоборот" (в другую сторону) CreativeRequest -> Project -> Opportunity ("->" означает ссылается) Да, все правильно - триггер не сработает, потому что поменялся Project, а не CreativeRequest. Надо повесить триггер еще на Project, который, будет отсылать данные точно также как и триггер CreativeRequest
или можно лучше сделать так - в триггере для Project собрать все CreativeRequest, которые на него ссылаются и сделать им update. Это запустит триггер для CreativeRequest, который соответственно и отошлет данные.
или можно лучше сделать так - в триггере для Project собрать все CreativeRequest, которые на него ссылаются и сделать им update. Это запустит триггер для CreativeRequest, который соответственно и отошлет данные.
Мне тоже кажется что это хорошая идея.
По логике триггер нужен только на update и delete
trigger ProjectRemoteUpdate on Project__c (after update, after delete) {
Set<Id> prjIds = new Set<Id>();if (Trigger.isUpdate) {
prjIds = Trigger.newMap.keySet();
} else if (Trigger.isDelete) {
prjIds = Trigger.oldMap.keySet();
}// имеем id project prjIds
// как получить список креатив реквестов?
// пройти по всем кр реквестам и выполнить триггер update или delete?CreativeRequest_TriggerHelperNTM3.updateCreativeRequest(action, crreqIds);
}
[quote="Dmitry Shnyrev"]или можно лучше сделать так - в триггере для Project собрать все CreativeRequest, которые на него ссылаются и сделать им update. Это запустит триггер для CreativeRequest, который соответственно и отошлет данные.[/quote] Мне тоже кажется что это хорошая идея. По логике триггер нужен только на update и delete [code] trigger ProjectRemoteUpdate on Project__c (after update, after delete) { Set<Id> prjIds = new Set<Id>(); if (Trigger.isUpdate) { prjIds = Trigger.newMap.keySet(); } else if (Trigger.isDelete) { prjIds = Trigger.oldMap.keySet(); } // имеем id project prjIds // как получить список креатив реквестов? // пройти по всем кр реквестам и выполнить триггер update или delete? CreativeRequest_TriggerHelperNTM3.updateCreativeRequest(action, crreqIds); } [/code]
По порядку - на delete не надо, потому что у тебя связь master-detail. Значит когда будут удалять Project, то CreativeRequest тоже удалятся, и соответственно твой триггер для CreativeRequest тоже запустится
остается только update
тут просто надо сделать так:
Выбрать SOQL запрос все CreativeRequest которые ссылаются на Project и сделать им Update
Вот как должно выглядеть:
List<CreativeRequest__c> crList = [SELECT Id FROM CreativeRequest__c WHERE Project__c in Trigger.new];
update crList
всё
По порядку - на delete не надо, потому что у тебя связь master-detail. Значит когда будут удалять Project, то CreativeRequest тоже удалятся, и соответственно твой триггер для CreativeRequest тоже запустится остается только update тут просто надо сделать так: Выбрать SOQL запрос все CreativeRequest которые ссылаются на Project и сделать им Update Вот как должно выглядеть: List<CreativeRequest__c> crList = [SELECT Id FROM CreativeRequest__c WHERE Project__c in Trigger.new]; update crList всё
Error: Compile Error: unexpected token: 'Trigger.new' at line 4 column 97
trigger ProjectRemoteUpdate on Project__c (after update) {
// if (Trigger.isUpdate) {
// projectId = Trigger.newMap.keySet();
List<CreativeRequest__c> crList = [SELECT Id FROM CreativeRequest__c WHERE Project__c in :Trigger.new];
update crList
// }
}
Возможно не in Trigger.new а Trigger.newMap.keySet() ?
Error: Compile Error: unexpected token: 'Trigger.new' at line 4 column 97 [code] trigger ProjectRemoteUpdate on Project__c (after update) { // if (Trigger.isUpdate) { // projectId = Trigger.newMap.keySet(); List<CreativeRequest__c> crList = [SELECT Id FROM CreativeRequest__c WHERE Project__c in :Trigger.new]; update crList // } } [/code] Возможно не in Trigger.new а Trigger.newMap.keySet() ?
Да можно.
[quote]Возможно не in Trigger.new а Trigger.newMap.keySet() ?[/quote] Да можно.
Все работает спасибо!
Вот конечный вариант:
trigger ProjectRemoteUpdate on Project__c (after update) {
List<Creative_Request__c> crList = [SELECT Id FROM Creative_Request__c WHERE Project__c in :Trigger.newMap.keySet()];
update crList;
}
Все работает спасибо! Вот конечный вариант: [code] trigger ProjectRemoteUpdate on Project__c (after update) { List<Creative_Request__c> crList = [SELECT Id FROM Creative_Request__c WHERE Project__c in :Trigger.newMap.keySet()]; update crList; } [/code]