2014年3月27日木曜日

データプロバイダーを使いこなそう - 応用編その1 ページング その2

前回はページングの実装として検索用データプロバイダーの修正と新たに件数取得用データプロバイダーを作成しました。今回はWebパネルの修正です。

3.Webパネルの修正

3-1.変数の追加

変数としてレコードカウント用SDT、ページカウント、最大ページ数用を定義します。




3-2.WebFromの修正

WebFormでは、ページング用のボタン(先頭ページ、前ページ、次ページ、最終ページ)を画像として貼り付けます。これは、標準グリッドのページングボタンにはユーザーイベントを定義できない為、独自で実装します。

実行時には標準のページング用ボタンは表示されません。なぜなら、データプロバイダーによって1ページ分のデータしかSDTコレクションに格納されないため、Grid自身が改ページの必要性を判別しないからです。(改ページボタンは取得したレコード数がGridの行数設定(Rowsプロパティ)を超えて初めて表示される)



3-3.イベントコードの修正

今まではデータプロバイダー側で検索処理を実装してきましたので、イベントコードはほとんどありませんでしたが、今回はページングの制御用コードが必要になります。
(コードとしてはもっと最適なロジックがあると思いますが、判りやすさを優先して書いています)

Event Start
&PageCount = 1
&PageCount.Visible=false
&PageMax.Visible=false
Endevent

Event Refresh
//件数の取得
&SDT_RecordCount=DP_CustomerCount(&CustomerName,
&CustomerAddress)
//最終ページの計算
&PageMax = INT(&SDT_RecordCount.Count / 10)
If MOD(&SDT_RecordCount.Count,10) > 0
&PageMax+=1
Endif

//検索処理
&SDT_CustomerCollection=DP_Customer(
(&PageCount-1)*10, //スキップ
10, //カウント(取得件数)
&OrderType, //ソート順
&CustomerName, //検索条件
&CustomerAddress) //検索条件

Endevent

Event 'PageFirst'
//先頭ページへ
&PageCount = 1
Refresh
Endevent

Event 'PagePrev'
//前ページへ
If &PageCount>1
&PageCount-=1
Refresh
Endif
Endevent

Event 'PageNext'
//次ページへ
If &PageCount < &PageMax
&PageCount+=1
Refresh
Endif
Endevent

Event 'PageLast'
//最終ページへ
&PageCount = &PageMax
Refresh
Endevent

Event 'Search'
//検索ボタン
&PageCount = 1
Refresh
Endevent


4.実行結果

実行結果です。このサンプルではプロシージャでレコード数を20,000件追加しています。


次ページでも、最終ページでも一瞬でレスポンスが返ります。
同じデータで前回の検索画面を実行したら数分待ってもレスポンスが返ってきませんでした。

この様にデータプロバイダーのページング機能を利用する事で、大量データの検索でもレスポンスを維持しつつAPサーバーの負荷を減らす事ができます。



5.おまけ、データセレクターの活用

今回の例では、実際の検索処理と検索結果の件数取得という2つのデータベースクエリーを実装していますが、検索条件の指定が冗長的になります。

複雑で多くの検索条件項目があった場合、その作成やメンテナンス時の記述ミスを考えると、冗長的な記述は避けたいですね。

こういったケースではデータセレクターオブジェクトを使用しましょう。
データセレクターとは「ソート指定(Order)」「検索条件(Where/When)」「Defined by」などFor eachのオプションを部品化するオブジェクトです。

適用先としてはFor eachコマンド、Grid、データプロバイダー、式(グローバル・ローカル)など、検索処理に幅広く使えます。

データセレクターオブジェクト。
今回は検索条件の2項目を部品化。
パラメータ渡しも可能。

顧客検索データプロバイダーに適用したところ

顧客検索件数データプロバイダーに適用したところ






0 件のコメント:

コメントを投稿