Есть несколько проблем с этим кодом.
Триггерный объект
Ваш триггер находится не на том объекте и делает прямо противоположное вашему заявленному намерению.
Мне нужно, чтобы поле ZIp code на prem__c автоматически обновлялось при редактировании соединения.
Ваш триггер на объекте Prem__c
пытается скопировать данные на объект Connection__c
, в то время как ваша цель - скопировать с Prem__c
в Connection__c
. Вам определенно понадобится триггер after update
на Connection__c
и триггер before insert
на Prem__c
; однако если отношения между этими двумя объектами - это «Уточняющий запрос» или отношение «мастер-деталь», настроенное для возможности восстановления, вам также потребуется триггер update
для дочернего объекта Prem__c
для обработки ситуаций, когда дочерняя запись переопределяется, путем обновление от нового родительского соединения.
Logic
Эта логика:
for (Prem__c p: [SELECT Connection_id__c,id, Name
FROM Prem__c
WHERE Connection_id__c
NOT IN (SELECT id FROM Connection__c)
AND id IN : Trigger.new ]){
connection.add(new Connection__c(
ZipCode__c = p.Zip_Code__c));
}
действительно не имеет смысла. Он находит только Prem__c
записей в наборе триггеров, которые не не имеют связанного соединения, устанавливает новое соединение, а затем не устанавливает связь между двумя записями. То, как это происходит, излишне неэффективно; что NOT IN
подзапрос не должен быть там, потому что он может просто с помощью Connection_Id__c = null
.
Вместо этого вы, вероятно, хотите, чтобы у вашего Connection__c
триггера был такой запрос:
SELECT ZipCode__c, (SELECT Zip_Code__c FROM Prems__r)
FROM Connection__c
WHERE Id IN :Trigger.new
Затем вы можете перебирать эти Connection__c
записи с внутренним циклом for
над их связанными Prem__c
записями. Обратите внимание, что выше вам нужно использовать фактическое имя отношения, где у меня есть Prems__r
. Логика будет выглядеть примерно так:
for (Connection__c conn : queriedConnections) {
for (Prem__c prem : conn.Prems__r) {
if (prem.Zip_Code__c != conn.ZipCode__c) {
prem.Zip_Code__c = conn.ZipCode__c
premsToUpdate.add(prem);
}
}
}
update premsToUpdate;
Перед запуском запроса вы также должны собрать Set<Id>
только тех записей, для которых поле ZipCode__c
фактически изменилось, т.е. где thisConn.ZipCode__c != Trigger.oldMap.get(thisConn.Id).ZipCode__c
. Вы будете использовать это Set<Id>
вместо Trigger.new
в своем запросе, чтобы получать эти записи только с соответствующими изменениями.