Apex触发自动填充多个记录的查找字段

时间:2018-04-28 19:15:51

标签: triggers salesforce apex-code apex

我正在尝试使用以下代码更新查询字段(Customer对象中的Benefit_ID),该代码适用于单个记录但是多个记录失败:

错误:“由以下原因引起:System.DmlException:插入失败。第0行出现第一个异常;第一个错误:CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY,”

trigger updatelookupfield_Customer on Customer__c (before insert,before update) {
    Set<String> Bundle = new Set<String>();

    for (Customer__c Cust : Trigger.new) {
        Bundle.add(Cust.Bundle__c);
    }
List<Benfit__c> BenfitList = [SELECT id, Bundle__c FROM Benfit__c WHERE Bundle__c IN :Bundle];

    Map<String, Benfit__c> shippingNumToContactMap = new Map<String, Benfit__c>();

    for (Benfit__c c : BenfitList) {
        shippingNumToContactMap.put(c.Bundle__c, c);
    }

    for (Customer__c o : Trigger.new) {
              if (o.Bundle__c != null) {
            o.Benefit_ID__c = shippingNumToContactMap.get(o.Bundle__c).id;
        }
        else {
            o.Benefit_ID__c = null;
        }
    }
    }

2 个答案:

答案 0 :(得分:0)

似乎问题将在线 o.Benefit_ID__c = shippingNumToContactMap.get(o.Bundle__c).id;您正尝试使用键从地图中获取值,但您不会检查地图中是否存在该键。

尝试在尝试为其获取值之前添加检查键是否在地图中。

trigger updatelookupfield_Customer on Customer__c (before insert,before update) {
Set<String> Bundle = new Set<String>();

for (Customer__c Cust : Trigger.new) {
    Bundle.add(Cust.Bundle__c);
}
List<Benfit__c> BenfitList = [SELECT id, Bundle__c FROM Benfit__c WHERE Bundle__c IN :Bundle];

Map<String, Benfit__c> shippingNumToContactMap = new Map<String, Benfit__c>();

for (Benfit__c c : BenfitList) {
    shippingNumToContactMap.put(c.Bundle__c, c);
}

for (Customer__c o : Trigger.new) {
          if (o.Bundle__c != null && shippingNumToContactMap.containsKey(o.Bundle__c)) {
        o.Benefit_ID__c = shippingNumToContactMap.get(o.Bundle__c).id;
    }
    else {
        o.Benefit_ID__c = null;
    }
}
}

Svata

答案 1 :(得分:0)

在我看来,好像你真的需要任何Apex。

因此,Customer上有一个名为Bundle__c的文本字段。

你还有一个名为Benfit__c的自定义对象,它也有一个名为Bundle__c的字符串字段。

您正在使用Customer上的Bundle__c字段来确定Benfit__c适用于哪些字段。

为什么不能直接从客户查找到Benfit__c?