Если параметр выбирается в фильтре как значение выпадающего списка с включенным признаком множественного выбора или как значение типа "Пользователь", "Орг.единица", "Группа" или "Категория", то такой параметр передается в отчет в виде строки со списком ID выбранных значений, разделенных запятыми:
123,456,789
Если ни одно значение не выбрано в выпадающем списке, то в отчет передается null, а если в значении типа "Пользователь", "Орг.единица", "Группа" или "Категория", то пустая строка. |
---|
Для работы со множеством значений в запросе можно использовать такой способ:
1.Для каждого параметра, поддерживающего множественный выбор, дополнить строку со списком значений запятыми в начале и в конце.
Дополнение значения параметра запятыми в начале и в конце.
Результатом будет преобразование строки со списком значений к виду:
,123,456,789,
Если же в фильтре не было выбрано ни одно значение, т.е. изначально была передана пустая строка или null, то в параметре будет строка вида
,,
2.Теперь каждое значение в строке выделено запятыми с обеих сторон. Для проверки, входит ли ID в список выбранных в фильтре и переданных в параметр значений, достаточно дополнить значение самого проверяемого ID запятыми слева и справа и проверить, входит ли такая подстрока в строку со списком значений. Например, входит ли в строку ',123,456,789,' подстрока ',456,' где 456 — это проверяемый ID.
В SQL-запросе для проверки такого параметра можно использовать выражение вида:
WHERE ((@subcat = ',,') OR (CHARINDEX(','+CAST(T.SubcatID as varchar(max))+',', @subcat) > 0))
или
WHERE ((@subcat = ',,') OR (@subcat like '%,'+CAST(T.SubcatID as varchar(max))+',%'))
или функцию GetMultiValues:
WHERE ((@subcat = ',,') OR (CAST(T.SubcatID as varchar(max)) IN (SELECT [Value] FROM [dbo].[GetMultiValues](@subcat, ',')))
В этом случае выражение будет возвращать "истина" если в фильтре не выбрано ни одно значение (т.е. в параметр передана пустая строка, которую мы в п.1 дополнили двумя запятыми в начале и в конце) или если выбран проверяемый ID, т.е. подстрока входит в строку.
В шапке отчета, как правило, выводится список значений, выбранных в фильтре:
Список значений, преобразованный в строку.
Для формирования такого списка можно использовать дополнительную таблицу, создаваемую запросом (выводится полное название категории):
SELECT
(select REPLACE(S.FullPath, '\u2044','\') +'; '
FROM Subcategories S
WHERE CHARINDEX(','+CAST(S.SubcatID as varchar(max))+',', @subcat) > 0
FOR XML PATH('')
) as SubcatNames
FROM Subcategories
В примере таблица называется SubcatSelected. В шапке отчета текст может формироваться, например, следующим образом:
для пользователей в группах: [[FilterSubcat]==",,"?" — ":[SubcatSelected.SubcatNames]]
Примеры аналогичных таблиц и выражений для фильтра по пользователям и по категориям:
Если проверку вхождения значения в список выбранных в фильтре нужно добавить в код, можно использовать выражение вида:
// если в списке отображаемых показателей отмечен показатель "план"
if (Report.GetParameterValue("FilterColumns").ToString().Contains("план"))
Чтобы каждый элемент списка выводился с новой строки, для более удобного восприятия, используйте тег переноса строки. |
---|