【问题标题】:Salesforce Account Owner Name on Case Trigger failing案例触发器失败时的 Salesforce 帐户所有者名称
【发布时间】:2012-08-08 12:01:11
【问题描述】:

我编写了一个触发器,将客户所有者名称放在为该客户创建的案例上。它在我的 200 批量测试中也可以工作和执行。这是代码:

trigger CaseBeforeInsertUpdate on Case (before insert, before update) {

   Set<Id> accountIds = new Set<Id>();
   Set<Id> accountOwnerIds = new Set<Id>(); 

   for (Case c : Trigger.new) {
        if(c.AccountId != null) {
            accountIds.add(c.AccountId);
        }       
   }
   Map<Id,Account> accountMap = new Map<Id, Account>([select Id, OwnerId from Account where Id IN :accountIds]);

   for (Account a : accountMap.values()) {
        if(a.OwnerId != null) {
            accountOwnerIds.add(a.OwnerId);
        }
   }

   Map<Id, User> userMap = new Map<Id,User>([select Name from User where Id IN :accountOwnerIds]);

   if(userMap.size() > 0) {
        for(Case c: Trigger.new) {  
            c.MerchantOwner__c = userMap.get(accountMap.get(c.AccountId).OwnerId).name;
        }
   }

}

我偶然发现了一个错误,但我不知道出了什么问题。如果我转到案例列表视图(即我的打开案例)并选择多个案例并关闭它们,我会收到错误消息:System.NullPointerException:尝试取消引用更新 MerchantOwner 字段的行的空对象。当我在我的测试类中大量关闭案例时,一切正常..

我最好的猜测是我正在尝试为没有附加帐户的案例执行此操作,但据我所知,我试图通过不首先将这些案例添加到 accountIds Set 来不更新这些案例.

有谁知道我做错了什么?任何帮助将不胜感激。

【问题讨论】:

  • 它似乎也发生在通过列表视图大规模更改所有权时

标签: salesforce apex-code


【解决方案1】:

我将更改以下 For 循环:

   for(Case c: Trigger.new) {  
        c.MerchantOwner__c = userMap.get(accountMap.get(c.AccountId).OwnerId).name;
    }

    for(Case c: Trigger.new) {  
        if (c.AccountId != null                                        // Make sure there is an Account linked to the Case
          && accountMap.ContainsKey(c.AccountId)                       // Make sure our Account query captured  it
          && accountMap.get(c.AccountId).OwnerId != null               // Make sure that account has an owner
          && usermap.ContainsKey(accountMap.get(c.AccountId).Ownerid)  // Finally make sure our User query found the owner
        ){
            c.MerchantOwner__c = userMap.get(accountMap.get(c.AccountId).OwnerId).name;
        }
    }

【讨论】:

  • 如何在答案中格式化代码...无论如何,我昨晚将代码更改为:for(Case c: Trigger.new) { if(accountMap.containsKey(c.AccountId)) { Account a = accountMap.get(c.AccountId); if(userMap.containsKey(a.OwnerId)) { c.MerchantOwner__c = userMap.get(a.OwnerId).name; } } } 这似乎与您建议的方式相同,或者您是否看到任何差异?跨度>
  • 除了编程风格和可读性之外,它们在功能上应该是相同的。您没有检查案例以确保它已链接到帐户(使 AccountId 为空),但 accountMap 永远不应该有一个空键,因此在那里没有影响。出于好奇,为什么要创建实例 Account a 而不是实例 User u?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多