如何自动将字段从一个Sobject复制到另一个

时间:2019-06-10 02:42:59

标签: salesforce

我正在尝试创建自动化以将连接sObject中的Zipcode__c文本字段复制到Prem sObject上的Zip_code__c文本字段。我无法使用公式引用,因为我需要能够搜索复制的字段。一个连接可以具有多个Prems。

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;
    }
}

编辑连接时,我需要自动更新prem__c上的ZIp代码字段。

1 个答案:

答案 0 :(得分:0)

此代码存在几个问题。

触发对象

您的触发器位于错误的对象上,并且与您声明的意图完全相反。

  

编辑连接时,我需要自动更新prem__c上的ZIp代码字段。

您在Prem__c对象上的触发器尝试将数据复制到Connection__c对象,而您的目标是从Prem__c复制到Connection__c。您肯定需要在after update上使用Connection__c触发器,并在before insert上使用Prem__c触发器;但是,如果两个对象之间的关系是“查找”或配置为可重设的主从关系,则还需要在子对象update上使用Prem__c触发器来处理子记录的情况通过从新的父级Connection更新来重新设置父级。

逻辑

此逻辑:

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));
                   }

真的没有道理。它仅在触发器集中找到{em>没有具有关联的Connection的Prem__c个记录,建立新的Connection,然后不在两个记录之间建立关系。这样做的方式不必要地效率低下; 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,以便仅获取具有相关更改的记录。