1

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

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

无论出于何种原因,都没有填充 ExpectedRevenue 字段的机会。

你会得到一个如下所示的表:

val___|所有者 ID

     |Id1
     |Id2
     |Id3

4/4 记录。

(旁注:你如何输入表格数据而不会让它看起来很糟糕?)

请注意,“val”列全部为空,最后一个 OwnerId 列也为空。

有 4 行,因为 SOQL 在汇总时也返回“总计”行。

在循环通过返回的 AggregateResult[] 时,代码会在如下所示的行上爆炸: AggregateResult[0].get('val'); 带有“System.NullPointerException:尝试取消引用空对象”

但是,如果其中只有 1 个用户有一些数据,那么整个事情就可以了。所以我猜测如果在特定列中没有行有任何数据,那么该列根本不存在,并且调用检索它会爆炸。

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

4

2 回答 2

1

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

我希望你想做的是在你跑步之前

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

你想要一个 if 语句说

if(AggregateResult.size() > 0)

或者可能

if(AggregateResult[0] != null)

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

尝试一下,它应该可以工作。否则发布一个更大的代码列表来查看。

保罗

于 2011-06-21T19:05:20.067 回答
0

如果您在子句中指定的过滤器没有要汇总的数据,where您将得到一个空的AggregateResult返回列表。isEmpty()您可以使用Apex中的列表对此进行测试。

于 2011-07-12T04:46:59.390 回答