我正确地解释了这个Apex代码吗?

时间:2017-04-11 16:21:57

标签: salesforce apex-code apex

我有两种Apex方法可以完成同样的事情。我是框架的新手,只是想确保我正确地解释它。

//Method 1: 
for (Account a : trigger.new) { 
  for (Contact c : [SELECT Id, OtherPhone FROM Contact WHERE AccountId= :a.Id]) { 
     c.OtherPhone= a.Phone; update c; } } 

//Method 2: 
for (Account a :trigger.new){ 
  acctMap.put(a.Id, a); 
}

for (Contact c : [SELECT Id, OtherPhone, AccountId FROM Contact WHERE 
AccountIdIN :acctMap.keySet()]){ 
  c.OtherPhone = acctMap.get(c.AccountId).Phone; 
  contactsToUpdate.add(c); 
} 
update contactsToUpdate;

我的假设是两种方法都会查看每个被触发的帐户,并将帐户电话号码附加到每个帐户下的每个Contact.OtherPhone变量中。方法1通过对每个联系人进行单独更新来完成此操作,方法2通过将所有受影响的联系人推送到哈希映射中来立即更新所有受影响的联系人。

这基本上是正确的吗?澄清我遇到的任何错误都将非常感激。谢谢!

1 个答案:

答案 0 :(得分:0)

你基本上是正确的,两者都在做同样的事情,但我不会同时使用。

长话短说,方法1不笨重,方法2是。

有关详细信息,我会说

  • 在方法1中,存在一些可能的问题(取决于代码的其余部分)

    1. 可能达到+100 SOQL查询调控器限制,因为每个帐户正在执行一个SOQL查询
    2. 可能会达到+150 DML声明
  • 在方法2中还有一些小问题

    1. 它通过所有元素从trigger.new创建一个地图,但是trigger.newMap已经有了地图,所以它的处理能力被浪费了,除非你想比较oldMap和newMap以防止不必要的更新。
    2. contactsToUpdate未在任何地方声明:P
  • 两者都在查询OtherPhone中获取,但是OtherPhone将被覆盖,所以除非你想用它做一些其他逻辑,否则不需要在soql查询中获取它(如果代码在组织很复杂,从堆大小保存的每个字节都有帮助。)

无论哪种方式,甚至可以在没有使用流程构建器的代码的情况下完成此功能;)

我希望它有所帮助。