Websoft

понедельник, июня 09, 2014

Разработка отчетов с большим количеством данных

Добрый день, коллеги.
Я думаю, что создание отчетов - одна из самых частых задач, встающих перед нами.
При этом заказчики хотят, чтобы отчет работал максимально удобно, а главное быстро.
Первая проблема решается грамотным выбором фильтров (подразделения, сотрудники и т.д.)
Я же хочу написать про вторую проблему. Коллегам сложно объяснить, что в тот момент, когда грузится страница, происходит многое:
  1.  Проверка заполнены ли поля фильтров, копирование данных из них
  2. Выполнение SQL запроса (или серии XQuery запросов и открытий каталогов)
  3. Вывод данных на странице

В случае с небольшими данными, все эти три этапа происходят мгновенно,  и сотрудник не успевает разозлиться в ожидании :)
Но как быть, если это большой, глобальный отчет?
Например, недавно я писал отчет по процедуре оценки, который вытаскивает данные по сотруднику (там были еще и доп. поля), по анкетам компетенций, деятельности, целям и планам развития (также там были и доп. поля)
В этом случае, терпение сотрудника может не выдержать , и он, не дождавшись окончания вывода данных, закроет страницу

Что же в этом случае можно сделать?
Пройдемся еще раз по пунктам выше:
  1. Вывод данных на странице
  2. Здесь все зависит от данных, но логично, чтобы SQL запросы был оптимальным (sql профайлер вам в помощь)
  3. Самая трудозатратная часть, ее мы и постараемся оптимизировать
Я вижу три пути
Два из них я проверял, третий пока только в теории
Итак:
1. Постраничный вывод.
Здесь все просто: мы выводит не все 5000 строк, а делим на мелкие части.
Выводим сначала 250 первых значений и добавляем ссылки "Предыдущие", "Последующие"

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

2.  Использование AJAX технологий
Алгоритм такой:
  1. Сотрудник заполняет фильтры, нажимает кнопку "Сформировать"
  2. Данные передаются через AJAX на отдельную страницу, где происходят все расчеты, формируется код страницы и создается XLS файл с отчетом на сервере
  3. На исходной странице появляется ссылка скачать отчет, пройдя по которой сотрудник скачивает файл

Достоинства:
1.  Самый быстрый вариант
Все расчеты ведутся на сервере, на исходной странице ничего не выводится, соответственно, самая трудозатратная часть у нас исключена
2.  Очень часто сотрудникам удобно работать в Excel-е
Действительно, как бы мы не любили WT,  Excel в части работы с данными ушел далеко вперед

Недостатки:
1) Сложно объяснить рядовому пользователю, что, вот сейчас, пока на странице мигает надпись "Отчет формируется..." и идет основная работа
Это обходится следующим: как только отчет сформировался, сотруднику уходит уведомление со ссылкой на отчет
Таким образом, даже, если сотрудник закроет страницу, данные все равно не потеряются


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


Спасибо за внимание. Если есть вопросы - готов ответить

2 комментария:

Эдуард Бабушкин комментирует...

а название то где?)

Райнур Хамидуллин комментирует...

Эдуард, тему добавил