tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:【大量データ処理】ページネーション機能の実装で注意すること

f:id:tyoshikawa1106:20150507001328p:plain

ApexではStandardSetControllerを使用することで簡単にページネーション機能を実装することができます。この方法を使った時、最大何件のレコードまで表示できるか確認してみました。


まず大量データの表示を行いたい場合は、『readOnly=true』の宣言が必要です。これにより通常の上限1000件を超えて表示することが可能になります。
f:id:tyoshikawa1106:20150506234335p:plain


※レコードの表示なら50000件、件数だけならそれ以上が可能になります。
f:id:tyoshikawa1106:20150506234724p:plain


StandardSetControllerを使ったページネーション機能を実装する場合はクエリは『Database.getQueryLocator(query)』というように実行します。
f:id:tyoshikawa1106:20150506235159p:plain


最大50000件まで表示できるようになるreadOnlyを宣言していてもDatabase.getQueryLocatorで取得できる件数の上限は10000件までとなっていました。
f:id:tyoshikawa1106:20150506235253p:plain


ということで..10000件以上の件数表示が必要なページネーション機能を実装する場合は、StandardSetController以外のやり方での対応が必要になるみたいです。


ちなみにDatabase.getQueryLocator(query)の結果はApexPages.StandardSetcontroller型として受け取ることになります。そのため実際に画面に表示する際にはgetRecords()を使ってsObject型に変換する必要があります。
f:id:tyoshikawa1106:20150507000802p:plain


このgetRecords()で取得できるレコードは全件ではなくsetPageSize()で指定した件数となります。レコード件数の確認には使用できないので注意が必要です。
f:id:tyoshikawa1106:20150507000951p:plain


今回の検証用に作成したサンプルコードです。

追記

上限の10000件を表示した場合のビューステートを確認してみました。結果は約5KBでガバナ制限でエラーになる135KBまでまだまだ余裕がありました。
f:id:tyoshikawa1106:20150507232045p:plain