2011-06-17 39 views
1

比方說,你跑,看起來像這樣的SOQL彙總查詢:如何解析沒有值的SOQL AggregateResult列?

select OwnerId, sum(ExpectedRevenue)val from Opportunity GROUP BY ROLLUP(OwnerId) 

無論出於何種原因,也有與ExpectedRevenue領域沒有機會填充。

你得到一個表,看起來像這樣:

VAL ___ | OWNERID

 |Id1 
    |Id2 
    |Id3 

4/4的記錄。

(旁註:你把表格數據,沒有它尋找可怕怎麼辦?)

,請注意該「VAL」列均爲空,最後OWNERID列也爲空。

有4行,因爲SOQL在彙總時也返回「總計」行。

在循環通過返回的AggregateResult []時,代碼在如下所示的一行中爆炸:AggregateResult [0] .get('val');與「System.NullPointerException:嘗試去引用一個空對象」

但是,如果只有其中一個用戶有一些數據,那麼整個事情的作品。所以我猜測,如果沒有行在特定列中有任何數據,那麼該列根本就不存在,並且調用來檢索它就會爆炸。

所以我的問題是你如何確定列是否存在以避免空引用錯誤?

回答

1

你已經說過,ownerid列和val列都是空的,因此AggregateResult [0]是一個指向空對象的指針,任何嘗試從該對象獲得一個提示都會給你帶來的錯誤。

我希望你想要做什麼是你運行

AggregateResult[0].get('val'); 

你想有一個if語句說

if(AggregateResult.size() > 0) 

或可能

if(AggregateResult[0] != null) 

,以確保前你不是試圖訪問一個空的對象。

試試看,它應該工作。否則張貼一個更大的代碼清單來查看。

保羅

0

如果沒有數據總結爲您在where子句指定你會得到AggregateResult空列表後面的過濾器。您可以在Apex中使用列表isEmpty()進行測試。