1

次のようなSOQL集計クエリを実行するとします。

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

何らかの理由で、ExpectedRevenue フィールドが入力された Opportunities はありません。

次のようなテーブルが得られます。

val___|所有者ID

     |Id1
     |Id2
     |Id3

4/4 レコード。

(補足: どうすれば見栄えを悪くせずに表形式のデータを入れることができますか?)

「val」列はすべて null であり、最後の OwnerId 列も null であることに注意してください。

SOQL はロールアップでも「合計」行を返すため、4 行あります。

返された AggregateResult[] をループすると、コードは次のような行で爆発します。 AggregateResult[0].get('val'); 「System.NullPointerException: Attempt to de-reference a null object」で

ただし、これらのユーザーの 1 人だけが何らかのデータを持っている場合は、すべてが機能します。したがって、特定の列にデータがある行がない場合、その列はまったく存在せず、それを取得するための呼び出しが失敗すると推測しています。

だから私の質問は、null 参照エラーを回避するために列が存在するかどうかをどのように判断するのですか?

4

2 に答える 2

1

ownerid 列と val 列はすべて null であると言ったため、AggregateResult[0] は null オブジェクトへのポインターであり、そのオブジェクトから値を取得しようとすると、エラーが発生します。

あなたがやりたいと思っていることは、あなたが走る前です

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 に答える