嗨我设计了一个触发器,它为来自其子对象(交易/优惠)的帐户提供汇总汇总最大日期值(它们与父项具有查找关系)...但每当我尝试删除子对象时我被抛出一个验证错误可以请求帮助,因为我是salesforce的新手并且无法解决它。
这是触发代码:
trigger accountupdate on Deal_Offer__c (after delete, after insert, after update) {
Set<id> accountIds = new Set<id>();
Date maxdate;
Date maxdate1;
Date maxdate2;
List<Account> accountsToUpdate = new List<Account>();
for (Deal_Offer__c item : Trigger.new)
accountIds.add(item.Account__c);
if (Trigger.isUpdate || Trigger.isDelete) {
for (Deal_Offer__c item : Trigger.old)
accountIds.add(item.Account__c);
}
// get a map of the Accounts and the related fields that need to be updated
Map<id,Account> accountMap = new Map<id,Account>([select id,Most_Recent_Live_Date_Homerun__c,Most_Recent_Live_Date_Chase__c,Most_Recent_Live_Date_Serve__c from Account where id IN :accountIds]);
// query the account and the related deals_offers and update the max_run_date fiels in the account
for (Account acc : [select id,Name,Most_Recent_Live_Date_Homerun__c,Most_Recent_Live_Date_Chase__c,Most_Recent_Live_Date_Serve__c,(select id,Most_Recent_Live_Date_Homerun__c,Most_Recent_Live_Date_Chase__c,Most_Recent_Live_Date_Serve__c from Deals_Offers__r) from Account where id IN :accountIds]) {
maxdate = acc.Deals_offers__r[0].Most_Recent_Live_Date_Homerun__c;
maxdate1 = acc.Deals_offers__r[0].Most_Recent_Live_Date_Chase__c;
maxdate2 = acc.Deals_offers__r[0].Most_Recent_Live_Date_Serve__c;
for (Integer i = 0;i < acc.Deals_Offers__r.size(); i++){
if(acc.Deals_Offers__r[i].Most_Recent_Live_Date_Homerun__c > maxdate){
maxdate = acc.Deals_Offers__r[i].Most_Recent_Live_Date_Homerun__c;
}
if(acc.Deals_Offers__r[i].Most_Recent_Live_Date_Chase__c > maxdate){
maxdate1 = acc.Deals_Offers__r[i].Most_Recent_Live_Date_Chase__c;
}
if(acc.Deals_Offers__r[i].Most_Recent_Live_Date_Serve__c > maxdate){
maxdate2 = acc.Deals_Offers__r[i].Most_Recent_Live_Date_Serve__c;
}
}
accountMap.get(acc.Id).Most_Recent_Live_Date_Homerun__c = maxdate;
accountMap.get(acc.Id).Most_Recent_Live_Date_Chase__c = maxdate1;
accountMap.get(acc.Id).Most_Recent_Live_Date_Serve__c = maxdate2;
//add the account to update list
accountsToUpdate.add(accountMap.get(acc.Id));
}
update accountsToUpdate;
}
这是我从帐户中删除交易/优惠时所得到的错误
保存受影响的记录时遇到自定义验证错误。遇到的第一个验证错误是“Apex触发器accountupdate导致意外异常,请联系您的管理员:accountupdate:执行AfterDelete导致:System.NullPointerException:尝试取消引用空对象:Trigger.accountupdate:第8行,第1列” 。
请告诉我我哪里弄错了,应该采取什么措施来解决它。
提前致谢
答案 0 :(得分:2)
Trigger.New 和 Trigger.old 都是触发上下文变量。 New为您提供更新的值,其中Old为您提供记录的先前值。
Trigger.new 在插入前,插入后,更新前,更新后可用
Trigger.old 在更新前,更新后,删除前,删除后可用。
你的代码试图在删除Record之后使用Trigger.New,并且删除后显然删除Trigger.New将为null。
请尝试使用
if(Trigger.isDelete)
在您的代码中,为特定的操作(插入,删除,更新)执行代码块。
Click here查看所有Apex Trigger Context变量。