如何解析没有值的SOQL AggregateResult列?

时间:2011-06-17 21:48:08

标签: salesforce soql

假设您运行的SOQL聚合查询如下所示:

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:尝试取消引用空对象”

然而,如果这些用户中只有一个拥有一些数据,那么整个过程就可以了。所以我猜测如果没有行在特定列中有任何数据,那么该列根本就不存在,并且调用它来检索它会爆炸。

所以我的问题是你如何确定列是否存在以避免空引用错误?

2 个答案:

答案 0 :(得分:1)

你已经说过ownerid列和val列都是null,因此AggregateResult [0]是一个指向null对象的指针,任何从该对象获取alue的尝试都会给你带来错误。

我希望你做的是在你运行

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

你想要一个if语句说

if(AggregateResult.size() > 0)

或可能

if(AggregateResult[0] != null)

确保您没有尝试访问空对象。

尝试一下,它应该工作。否则,请发布更大的代码清单以进行查看。

答案 1 :(得分:0)

如果没有数据汇总您在where子句中指定的过滤器,则会获得AggregateResult的空列表。您可以使用Apex中的列表isEmpty()来测试。