Службы Reporting Services / Поддержка надежной фильтрации - PullRequest
0 голосов
/ 01 июня 2009

Я ищу способ «лучшей практики» для решения этого распространенного сценария. Я думаю, что вопрос лучше всего задать на примере. Давайте предположим следующее:

  • Цель состоит в том, чтобы написать «сводный отчет по заказам», который отображает список заказов на основе различных критериев фильтрации.
    • Пример: пользователь хочет отчитываться по всем заказам, созданным в период между X и Y
    • Пример: пользователь хочет отчитываться по всем заказам со статусом «открыто»
    • Пример: пользователь хочет сообщить обо всех заказах, сгенерированных другим пользователем XYZ
    • Пример: пользователь хочет отчитываться по всем заказам от 1000 до 10000 долларов
  • Эти отчеты, вероятно, будут запускаться с разных страниц, но, возможно, может существовать страница «расширенного поиска», которая позволяет им проверять / снимать флажки фильтров и определять параметры

  • Я хочу использовать удаленную обработку для генерации отчета

Создание единого отчета со всеми этими фильтрами, реализованными с помощью параметров отчета и фильтров отчетов, становится ОЧЕНЬ громоздким и НЕОБХОДИМЫМ ОЧЕНЬ быстро. Это заставляет меня поверить, что я должен создать одну хранимую процедуру, которая принимает все возможные значения фильтра (и NULL, если набор результатов не должен фильтроваться параметром).

Согласны ли вы с этой оценкой?

Если это так, я не эксперт TSQL и хотел бы получить несколько общих советов о том, как реализовать эту хранимую процедуру. Пока я делаю это так:

  1. Создать табличную переменную orderID @ resultset
  2. Заполнить @resultset изначально через первый фильтр (я выбрал дату начала и окончания)
  3. Для каждого фильтра:
    • Если фильтр определен, создайте табличную переменную @tempresultset и вставьте все записи из @resultset WHERE (фильтр применим)
    • Удалить из @resultset, вставить в @resultset выбрать orderid из @ tempresultset
  4. вернуть @resultset после применения всех фильтров

Это просто не кажется правильным / эффективным ... Есть ли лучший способ приблизиться к этому?

Будем весьма благодарны за любые другие предложения или советы о том, как подойти к этой общей проблеме. Я чувствую себя несколько потерянным из-за того, как правильно реализовать это решение, что, по-видимому, должно быть очень распространенной проблемой.

1 Ответ

0 голосов
/ 01 июня 2009

После некоторых исследований я нашел хороший способ реализовать эти необязательные фильтры в одном операторе select внутри хранимой процедуры:

Это выглядит примерно так:

SELECT ordernumber FROM orders
--Filter #1 - based on Parameter #1
WHERE (@param1 IS NULL) OR (somefield = @param1)
--Filter #2 - based on Parameter #2
AND WHERE (@param2 IS NULL) or (somefield2 = @param2)
--Filter #3 - based on Parameter #3
AND WHERE (@param3 IS NULL) or (somefield3 = @param3)
...