我正在尝试创建自动化以将连接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代码字段。
答案 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
,以便仅获取具有相关更改的记录。