Batch ApexでAggregate SOQL集計クエリと結果の使用

前回の投稿には、インタフェースDatabase.Batchableを継承したスケージュール可能なApex一括処理バッチを作成しましたが、 “GROUP BY”での集計クエリと結果のSOQL、例:SUM(), MAX(), COUNT()、を使用したい場合、単なるDatabase.Batchable<AggregateResult>に継承を変更することで解決できません、 次のようなコンパイルエラーが発生するためです :

Class must implement the global interface method: Iterable<AggregateResult> start(Database.BatchableContext) from Database.Batchable<AggregateResult>

次のサンプルコードをこのような問題を説明できます。

この問題を解決するには、インタフェースIterator<AggregateResult>Iterable<AggregateResult>を継承したApexクラスの使用することが今まで1つ有効的な解決策です。

実装概要は下記のようになります。
1. インタフェースIterator<AggregateResult>を継承したApexクラスを作成する
2. インタフェースIterable<AggregateResult>を継承したApexクラスを作成する
3. Batch ApexをDatabase.Batchable<AggregateResult>に継承し、start処理にIterable<AggregateResult>を使用する

早速はじめましょう。

インタフェースIterator<AggregateResult>

次のソースコードで1つApexクラス”AggregateResultIterator”を作成します。

インタフェースIterable<AggregateResult> Apex class

次のソースコードで1つApexクラス”AggregateResultIterable”を作成します。

一括処理バッチの修正

バッチの継承元をインタフェースDatabase.Batchable<AggregateResult>に変更し、start処理にDatabase.QueryLocatorを代わりに、Iterable<AggregateResult>とAggregateResultIterableを使用します。 次のようになります :

動作確認

SampleAggregateBatchを実行して、デバッグログを確認します。

問題なく実行できました! : )

Enjoy it!