Triggers Apex触发器自动填充多条记录的查找字段
我正在尝试使用以下代码更新查找字段(客户对象中的Benefit_ID),该代码对单个记录运行良好,但对多个记录运行失败: 错误:“原因:System.DmlException:插入失败。第0行出现第一个异常;第一个错误:无法\u插入\u更新\u激活\u实体,”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
在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;
}
}
}