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

Не срабатывает тригер если изменить родительский елемент

Есть следующая "ерархия" объектов:

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 получать все что нам надо?

Snn
Есть следующая "ерархия" объектов:

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, который соответственно и отошлет данные.

Dmitry Shnyrev
или можно лучше сделать так - в триггере для 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);
}

Snn
[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() ?

Snn
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() ?

Возможно не 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;
}

Snn
Все работает спасибо!

Вот конечный вариант:
[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]