2012-09-26 23 views
0

您好我設計了一個觸發器,它提供彙總彙總最大值日期值從其子對象(交易/優惠)(他們有一個查找與父母的關係)的帳戶。 ..但每當我嘗試刪除一個孩子對象我被拋出一個驗證錯誤可以請幫助,因爲我是新來的salesforce,無法解決它。我無法解決錯誤nullobject引用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; 

}

這是當我從帳戶中刪除的處理/報價

有自定義的驗證錯誤我收到錯誤(S )在保存受影響的記錄時遇到。遇到的第一個驗證錯誤是「Apex觸發器accountupdate導致意外的異常,請聯繫您的管理員:accountupdate:執行AfterDelete導致:System.NullPointerException:嘗試解除引用空對象:Trigger.accountupdate:line 8,column 1」 。

可以請告訴我在哪裏我得到它錯誤,它應該怎麼做來補救它。

在此先感謝

回答

2

Trigger.NewTrigger.old都是觸發上下文變量。新增爲您提供更新後的值,其中,舊爲您提供了該記錄的先前值。

Trigger.new在插入之前也可以插入後,更新之前,更新

Trigger.old後在之前可用更新,更新後,之前刪除,刪除後。

你的代碼試圖在使用Trigger.New後刪除記錄被刪除的地方,以及刪除後的明顯的Trigger.New將會有null。

請儘量使用
如果(Trigger.isDelete) 在你的代碼,使代碼的特定操作正在執行的塊(插入,刪除,更新)。 Click here查看所有Apex觸發器上下文變量。