以前の記事の1つで、ODataプロトコルを使用してリモートサーバーでグリッドコントロールがどのように機能するかを簡単に説明しました。 最新のグリッドコントロールを使用すると、データを複数の列に簡単にグループ化できます。 グリッドが自動データグループ化を実行する場合に、RESTサーバーへの要求がどのように定式化されるかをより詳細に検討してみましょう。
利便性(なぜ必要なのか)
複数の列でレコードをグループ化できるグリッドコントロールにより、プログラマーとエンドユーザーの両方の生活が大幅に簡素化されます。 たとえば、タスクのリストをグループ化したり、ヘルプが必要なタスクを強調表示したり、優先度で分類したりすることができると便利です。
次に、従業員ごとにグループ化し、選択した従業員のすべてのタスクを、ステータスと優先度別にグループ化して表示できます。
開発者にとって特に便利なのは、わずか数行のコードでこのような快適なインターフェースを作成することができることです。
方法
サンプルタスクリストを用意しました
databoom.space/samples_devexpress_grouping.htmlこの例では、Devexpress
dxDataGridを使用しました(このグリッドはDevExtreme Webコンポーネントセットの一部です)
詳細については、dxDataGridのドキュメントを参照してください。
js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxDataGrid
例を参照してください:
js.devexpress.com/Demos/WidgetsGallery/#demo/datagridgridpagingandscrollingpager/generic/light/default
databoomサーバーとグループ化せずにグリッドがどのように機能するかの簡単な例:
databoom.space/samples_devexpress_grid.html
グリッドがデータブームで動作するためには、グリッドに表示するデータのリスト、たとえば人のリストを含むURLを指定するだけで十分です。
samples.databoom.space/api1/sampledb/collections/persons
グリッドでグループ化を有効にするには、プロパティを指定するだけです
groupPanel:{visible:true}その後、グリッドを使用すると、列ヘッダーをグループ化パネルにドラッグしてデータをグループ化できます。
グリッドが最初のインプレッションで列のデータをグループ化するには、列の説明で以下を指定する必要があります。
groupIndex:0 (最初の列の場合、データがグループ化されるコンテンツによって)
groupIndex:1 (2番目の列など)
ほんの2、3の設定、そしてユーザーはあなたに感謝するでしょう:)仕組み
タスクのリストを取得できるグリッドURLを指定しました
samples.databoom.space/api1/sampledb/collections次に、グリッドはURLにさまざまな要求条件を追加することにより、サーバーへの要求を自動的に生成します。
ステータスと優先度でグループ化されたタスクのリストを表示するためにグリッドがサーバーに送信する最初の要求:
https://samples.databoom.space/api1/sampledb/collections/tasks?$orderby=Task_Status,Task_Priority,id&$top=21&$inlinecount=allpages- $ orderby = Task_Status、Task_Priority-ステータスと優先度でレコードをソートします
- $ top = 31-グリッドは結果を制限して31レコードを送信するよう要求します
- $ inlinecount = allpages-コレクション内のレコードの合計数を返すグリッド要求
データはソートされているため、彼はグループとして最初のレコードの「Task_Status」および「Task_Priority」フィールドの値を取得します。 次に、これらのフィールドの値が重複するいくつかのエントリがあります。 次に、優先度が変更されたいくつかのエントリがあります。 つまり、この場合、並べ替えられたデータを取得するには単純なクエリで十分です。
グリッドを下にスクロールして残りのレコードを表示すると、グリッドはサーバーに次のレコードを要求します。たとえば:
https://samples.databoom.space/api1/sampledb/collections/tasks?$orderby=Task_Status,Task_Priority,id&$skip=29&$top=32&$inlinecount=allpagesこの場合、別のクエリパラメータが追加されました。
- $ skip = 29-指定された数のエントリをスキップします
上記のリクエストは、ステータスと優先度でソートされたタスクのリストを表示するためにグリッドがサーバーに送信する単純なリクエストと違いはありません。
次に、ステータスが「完了」のレコードのグループを折りたたんでみましょう。 グリッドは2つのリクエストをサーバーに送信します。
- https://samples.databoom.space/api1/sampledb/collections/tasks?$top=1&$filter=(Task_Status eq 'Completed')&$ inlinecount = allpages
- https://samples.databoom.space/api1/sampledb/collections/tasks?$orderby=Task_Status,Task_Priority,id&$top=31&$filter=((Task_Status ne 'Completed'))&$ inlinecount = allpages
最初のリクエスト- $ filter =(Task_Status eq 'Completed')-ステータスが「Completed」のすべてのレコードを選択します(折りたたまれているもの)
- $ top = 1-グリッドは1つのレコードのみを要求します
- $ inlinecount = allpages-このステータスのレコードの総数を返すグリッド要求
このリクエストは、ステータスが「Completed」(折りたたまれているもの)のレコードの数を調べるために必要です。
2回目のリクエスト- $ orderby = Task_Status、Task_Priority-指定されたフィールドでデータをソートします
- $ filter =(Task_Status ne 'Completed')-「Completed」以外のステータスを持つすべてのレコードを選択します(ステータスが「Completed」で折りたたまれた後にあるレコード)
- $ top = 31-グリッドは31レコードを要求します
- $ inlinecount = allpages-このステータスのレコードの総数を返すグリッド要求
次のグループを折りたたむと、これらの2つのクエリの最初は、折りたたまれているグループのレコード数も要求しますが、次のクエリには、2つの折りたたまれたグループのレコードからの例外が既に含まれています:
- $ filter =(Task_Status ne 'Completed')および(Task_Status ne 'Deferred')
したがって、グリッドは、ソート、単純なフィルタリング、およびページ出力条件を使用して、単純なクエリを非常にうまく処理します。
備考(動作方法)
多数のグループの場合、不等式($ filter = ... and ... and ... and ... and ...)の条件が多数あるすべての折りたたまれたグループをフィルター処理するクエリが大きくなり、効果が不十分になります。
グループのリストを取得してから、フィールドが等しいかどうかのレコード(特定のグループに属するすべてのレコード)を要求し、これらのフィールドでソートすることができます。 このようなクエリは、必要なインデックスが与えられると、1つのグループ内の少数のレコードをすばやく受け取り、この少数をソートします。
ただし、この方法で機能するには、データ集約のリクエストの実行を標準化する機能が必要です。
データ集約の要求を満たす機能はOData標準バージョン4.0に
登場し、グリッドコントロールのメーカーは製品の新しいバージョンでこれらの機能のサポートを実装する予定です。