Отчёты с многозначными параметрами

Чтобы познакомиться с подобного рода отчётами воспользуемся готовым отчётом «Список подборки подборки для нескольких заказов», который уже размещён на сервере:

Список подборки для нескольких заказов с многозначными параметрами

Добавьте этот существующий отчёт к нашему проекту из папки «Мои документы». Обратите внимание, здесь мы не будем использовать хранимые процедуры, а будем использовать запрос, непосредственно внутри отчёта и использовать конструкцию типа «where o.OR01001 in (@OrderNumbers)». Переменная @OrderNumbers при построении отчёта будет подменена значениями.

Набор данных отчёта с многозначными параметрами

Флажок «Многозначное» в параметре отчёта и позволяет выбирать несколько значений из списка:

Параметры отчёта с флажком «Многозначное»

Эта возможность отсутствует в версии MS SQL 2000 и появилась, только начиная с версии MS SQL 2005. Сейчас Вам предоставляется возможность исследовать особенности отчёта, в частности обратите внимание, каким образом можно вывести значение параметра «OrderNumbers» в одну строку, разделённую запятыми. Чтобы наполнить отчёт данными используйте в качестве поисковой строки часть имени покупателя «Триал».

Чем ещё интересен этот отчёт? Тем, что это пример документа, который отсутствует в Скале и который невозможно получить стандартными средствами.

Возможно, у Вас возникнет вопрос «можно ли использовать хранимые процедуры в отчётах с многозначными параметрами?»

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

Ниже приведён пример такого кода:

Фрагмент из параметров хранимой процедуры:

@WHs nvarchar(4000)='RW01,RW02,RW03,RW04,RW05,RW06', --Склады прихода годной продукции

Фрагмент кода — преобразования

-- Разбираем строку значений, разделенных запятыми из переменной @WHs и вставляем в таблицу:
Declare @Warehouses table (WHCode nvarchar(6))
-- Переменные для "разбора" длинной переменной @WHs на отдельные значения
Declare @WhCode nvarchar(6), --Код склада
@WHsLen int, --Длина переменной @WHs
--Служебные переменные
@Cnt1 int,
@Cnt2 int
Set @WHsLen = Len(@WHs)
Set @Cnt1 = 1
While @Cnt1 <= @WHsLen
Begin
Set @Cnt2 = Charindex(',', @WHs, @Cnt1)
-- Последнее значение из @WHs, после которой нет запятой
If @Cnt2 = 0 Set @Cnt2 = @WHsLen + 1
-- Получаем код склада из строки значений
Set @WhCode = Substring(@WHs, @Cnt1, @Cnt2 - @Cnt1)
Set @Cnt1 = @Cnt2 + 1
-- Вставляем в таблицу
Insert into @Warehouses Values (@WhCode)
End
-- После разбора значений и помещения этих значений в таблицу необходимо использовать join на нее в основном запросе

Фрагмент основного запроса:

…	SC01060 as ExtProductGroup
	FROM SC070100 SC07 (NOLOCK)
	LEFT JOIN SC010100 SC01 (NOLOCK)
			ON SC07003 = SC01001
	join @Warehouses WH
		on SC07009=WH.WHCode
	WHERE (SC07003 BETWEEN upper(@SC1) AND upper(@SC2))
	AND (SC07002 BETWEEN @d1 AND @d2)
	and SC07001='00'

Содержание: