Triggers Apex触发器自动填充多条记录的查找字段

Triggers Apex触发器自动填充多条记录的查找字段,triggers,salesforce,apex-code,apex,Triggers,Salesforce,Apex Code,Apex,我正在尝试使用以下代码更新查找字段(客户对象中的Benefit_ID),该代码对单个记录运行良好,但对多个记录运行失败: 错误:“原因:System.DmlException:插入失败。第0行出现第一个异常;第一个错误:无法\u插入\u更新\u激活\u实体,” 在Customer\uuuu c上触发updatelookupfield\u Customer(插入前,更新前){ 集合束=新集合(); 用于(客户:触发器。新建){ Bundle.add(客户Bundle\uu c); } List B

我正在尝试使用以下代码更新查找字段(客户对象中的Benefit_ID),该代码对单个记录运行良好,但对多个记录运行失败:

错误:“原因:System.DmlException:插入失败。第0行出现第一个异常;第一个错误:无法\u插入\u更新\u激活\u实体,”

在Customer\uuuu c上触发updatelookupfield\u Customer(插入前,更新前){
集合束=新集合();
用于(客户:触发器。新建){
Bundle.add(客户Bundle\uu c);
}
List BenfitList=[从BENFITC中选择id,Bundle\uuuu c,其中Bundle\uu c IN:Bundle];
Map shippingNumToContactMap=新地图();
适用于(Benfit_uu_uC:BenfitList){
shippingNumToContactMap.put(c.Bundle\uu c,c);
}
对于(客户_uuuc o:Trigger.new){
如果(o.Bundle\uuu c!=null){
o、 Benefit_ID__c=shippingNumToContactMap.get(o.Bundle__c).ID;
}
否则{
o、 福利ID\uu c=null;
}
}
}

问题似乎将在线解决 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;
    }
}
}
在Customer\uuuu c上触发updatelookupfield\u Customer(插入前,更新前){
集合束=新集合();
用于(客户:触发器。新建){
Bundle.add(客户Bundle\uu c);
}
List BenfitList=[从BENFITC中选择id,Bundle\uuuu c,其中Bundle\uu c IN:Bundle];
Map shippingNumToContactMap=新地图();
适用于(Benfit_uu_uC:BenfitList){
shippingNumToContactMap.put(c.Bundle\uu c,c);
}
对于(客户_uuuc o:Trigger.new){
if(o.Bundle\uu c!=null&&shippingNumToContactMap.containsKey(o.Bundle\uu c)){
o、 Benefit_ID__c=shippingNumToContactMap.get(o.Bundle__c).ID;
}
否则{
o、 福利ID\uu c=null;
}
}
}

Svata

在我看来,这里似乎并不需要任何顶点

所以在Customer上有一个文本字段,名为Bundle\uu\c

您还有一个名为Benfit_;c的自定义对象,它还有一个名为Bundle__;c的字符串字段

您正在使用Customer上的Bundle_;c字段来计算哪个Benfit__;c适用于他们


为什么不能直接从客户处查找Benfit_u__c?

我认为这可能与更新前的状态有关。因为您正在基于客户对象更新另一个对象。您需要确保客户已完全更新。因此,将此代码移动到customer上的after insert/update触发器。
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;
    }
}
}