Как автоматически копировать поля из одного объекта в другой - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь создать автоматизацию для копирования Zipcode__c текстового поля в соединении sObject в Zip_code__c текстовое поле в Prem sObject. Я не могу использовать ссылки на формулы, так как мне нужно искать скопированное поле. Одно соединение может иметь много премов.

trigger updatePremFromConnection on Prem__c (before insert,after insert, after update,before update) {
    List<Connection__c> connection = new List<Connection__c>();
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));
                   }
    if (connection.size() > 0) {
        insert connection;
    }
}

Мне нужно, чтобы поле ZIp code на prem__c автоматически обновлялось при редактировании соединения.

1 Ответ

0 голосов
/ 10 июня 2019

Есть несколько проблем с этим кодом.

Триггерный объект

Ваш триггер находится не на том объекте и делает прямо противоположное вашему заявленному намерению.

Мне нужно, чтобы поле 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 в своем запросе, чтобы получать эти записи только с соответствующими изменениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...