Сетка, Группировка Данных И Odata

В одной из предыдущих статей мы кратко описали, как работают элементы управления сеткой с удаленным сервером по протоколу OData. Большинство современных элементов управления сеткой позволяют удобно группировать данные в несколько столбцов.

Давайте подробнее рассмотрим, как формулируются запросы к REST-серверу в случае, когда грид автоматически группирует данные.

Удобство (зачем оно нужно) Элементы управления сеткой, позволяющие группировать записи в несколько столбцов, существенно упрощают жизнь как программисту, так и конечному пользователю.

Очень удобно иметь возможность сгруппировать, например, список задач, выделить задачи, требующие помощи, разделить их по приоритету и т. д.

Сетка, группировка данных и OData

Затем вы можете сгруппировать их по сотрудникам и просмотреть все задачи для выбранного сотрудника, также сгруппированные по статусу и приоритету.



Сетка, группировка данных и OData

Что особенно приятно для разработчиков, так это то, что для создания такого удобного интерфейса требуется всего несколько строк кода.

Как это сделать Мы подготовили примерный список задач databoom.space/samples_devexpress_grouping.html В этом примере мы использовали dxDataGrid компании.

Девэкспресс (эта сетка включена в набор компонентов DevExtreme Web)

Более подробную информацию можно найти в документации dxDataGrid: js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxDataGrid см.

примеры: js.devexpress.com/Demos/WidgetsGallery/#demo/datagridgridpagingandscrollingpager/generic/light/default простой пример работы сетки без группировки с сервером бум данных : databoom.space/samples_devexpress_grid.html Чтобы сетка работала бум данных Достаточно указать URL со списком данных для отображения в сетке, например, список людей: sample.databoom.space/api1/sampledb/collections/persons

Чтобы включить группировку в сетке, достаточно указать свойство groupPanel: {видимый: правда} Затем сетка позволяет группировать данные, перетаскивая заголовки столбцов на панель группировки.

Чтобы сетка при первом отображении группировала данные в некоторые столбцы, необходимо указать в описании столбцов: групповойиндекс: 0 (для первого столбца, по содержимому которого сгруппированы данные) индекс группы: 1 (для второго столбца и т. д.) Всего пара настроек, и пользователи скажут вам спасибо :) Как это работает Мы указали URL-адрес сетки, по которой она может получить список задач.

sample.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 – сортировка записей по статусу и приоритету
  • $топ =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 В этом случае был добавлен еще один параметр запроса:

  • $пропустить =29 – пропустить указанное количество записей
Перечисленные выше запросы ничем не отличаются от простых запросов, которые Grid отправит на сервер для отображения списка задач, отсортированного по статусу и приоритету.

Теперь попробуем свернуть группу записей со статусом «Завершено».

Грид отправляет на сервер 2 запроса:

  1. https://samples.databoom.space/api1/sampledb/collections/tasks?$top=1&$filter=(Task_Status eq 'Завершено')&$inlinecount=allpages
  2. https://samples.databoom.space/api1/sampledb/collections/tasks?$orderby=Task_Status,Task_Priority,id&$top=31&$filter=((Task_Status не 'Завершено'))&$inlinecount=allpages
Первый запрос
  • $фильтр =(Task_Status eq 'Завершено') — выбираем все записи со статусом «Завершено» (те, которые сворачиваем)
  • $топ =1 – сетка запрашивает только одну запись
  • $inlinecount =allpages – сетка просит вернуть общее количество записей с заданным статусом
Этот запрос нужен для того, чтобы узнать количество записей со статусом «Завершено» (тех, которые сворачиваем) Второй запрос
  • $orderby =Task_Status,Task_Priority – сортировка данных по указанным полям
  • $фильтр =(Task_Status ne 'Завершено') – выбрать все записи со статусом, отличным от «Завершено» (те записи, которые идут после свернутых со статусом «Завершено»)
  • $топ =31 – сетка запрашивает 31 запись
  • $inlinecount =allpages – сетка просит вернуть общее количество записей с заданным статусом
Если мы свернём следующую группу, то первый из этих двух запросов также запрашивает количество записей в сворачиваемой группе, но следующий запрос теперь включает исключения из записей в двух сворачиваемых группах:
  • $фильтр =(Task_Status не «Завершено») и (Task_Status не «Отложено»)
Таким образом, сетка вполне успешно справляется с простыми запросами, используя сортировку, простую фильтрацию и условия пейджинга.

Примечания (как это может работать) В случае большого количества групп запросы, фильтрующие все свернутые группы, с большим количеством условий неравенства ($filter=.

и .

и .

и .

и .

) становятся слишком большими.

и недостаточно эффективно.

Можно просто получить список групп, а затем запросить записи по равенству полей (все записи, принадлежащие определенной группе) с просьбой отсортировать по этим полям.

Такой запрос, при наличии необходимых индексов, быстро извлекает небольшое количество записей внутри одной группы и затем это небольшое количество сортирует. Но чтобы работать таким образом, необходимо было бы иметь возможность выполнять запросы на агрегацию данных стандартизированным способом.

Возможность выполнять запросы на агрегацию данных появилась в стандарте OData версии 4.0. , а производители систем управления сетями планируют реализовать поддержку этих функций в новых версиях своих продуктов.

Теги: #odata #json #JavaScript #restful #rest #rest apiful api #devexpress #devexpress #devexpress #devextreme #разработка веб-сайтов #JavaScript #программирование

Вместе с данным постом часто просматривают: