powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / Reporting Не работает параметр с множественным выбором значений
10 сообщений из 10, страница 1 из 1
Reporting Не работает параметр с множественным выбором значений
    #39389325
andrst65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Развернут сервер отчетности SSRS версии 2012. C ним работает Report Builder 3.0. Все, казалось бы, начало работать до того момента, как приспичило в качестве параметра отчета использовать список значений с возможностью выбора НЕСКОЛЬКИХ значений. Например так: (вложение Безымянный). При фактическом выборе нескольких значений параметр сохраняет только ПЕРВОЕ выбранное значение. "Доказательство": Значение элемента: =Parameters!proekt.Value(0)

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

Итак, что я ожидаю: при выборе значений из списка городов Москва, С-Петербург и Екатеринбург параметр проект должен принять значение: "Москва;С-Петербург;Екатеринбург". "Фактически": "Москва".

Слова Доказательство и Фактически - в кавычках. Потому как и сам не пойму его истинное значение и как все-таки передать в ХП набор выбранных значений параметра...
...
Рейтинг: 0 / 0
Reporting Не работает параметр с множественным выбором значений
    #39389343
IDVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Совсем не понятен Ваш вопрос, да веткой форума Вы ошиблись:

1. Вы наверное в запросе указываете явное равенство (... Where pole = @Param...), а нужно (....Where pole in (@Param)....)
2. Ваше доказательство всегда вернет первое значение (позиция 0), данные этого параметра хранятся в массиве а не в строке.

Надеюсь я правильно понял вопрос.
...
Рейтинг: 0 / 0
Reporting Не работает параметр с множественным выбором значений
    #39389359
andrst65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IDVT, искал, да так и не нашел ветку для Reporting. Список значений формируется на основе запроса. Проще некуда. Типа select город from города. На то он и параметр с возможностью выбора нескольких значений из списка, и он РАБОТАЕТ. Города выбираются. И в заголовке видно полное (правильное, ожидаемое) значение параметра. Список выбранных значений через точку с запятой. Этот параметр в таком виде и должен передаваться в процедуру, где через стандартную функцию типа split будет "развернут" список городов во временную табличку.
Но проблема как раз в том, что значение параметра остается ПО ПЕРВОМУ ВЫБРАННОМУ ЗНАЧЕНИЮ. Просто "Москва"... Все перепробовал, не могу понять в чем дело

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
Reporting Не работает параметр с множественным выбором значений
    #39389413
IDVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrst65Этот параметр в таком виде и должен передаваться в процедуру, где через стандартную функцию типа split будет "развернут" список городов во временную табличку

Не совсем понятно что Вы пытаетесь сделать с параметром. Вы выбрали некоторые значения в отчете, и нажали кнопку формирования отчета, что должно потом происходить в ХП'шки.

На сервере ваш запрос будет выглядеть как то так:
Код: sql
1.
select a from test where a in (N'Казань',N'Орел',N'Чехов')

где перечисление и есть выбранные поля в параметре
...
Рейтинг: 0 / 0
Reporting Не работает параметр с множественным выбором значений
    #39389448
IDVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется я понял в чем проблема у Вас =)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
--- источник данных для параметра множественного выбора, DataSet1

      select 'Москва' as City
union select 'Орел'
union select 'Казань'
union select 'Подольск'
union select 'Чехов'


-- функция парсер

create function dbo.ParsInRows
( @List NVarChar(4000)
, @Delimetr NChar(1) = N','
) Returns table as return
With [List] ([No],[Pos],[To]) as ( Select 0
                                        , 0
                                        , 0
                                   union all
                                   Select L.[NO] + 1
                                        , L.[TO] + 1
                                        , I.[TO]
                                   from  [LIST] L 
                                         cross apply (
                                                       select CharIndex( @Delimetr
                                                                       , @List + @Delimetr
                                                                       , L.[TO] + 1)) I ([To])
                                   where I.[TO] > 0
                                  )
    select [NO]
	      ,SubString(@LIST,[POS],[TO]-[POS]) as ITEM
		  ,[POS]
    from  [LIST]
    where [TO] > [POS]

-- процедура для отчета, результат парсера параметра, DataSet2

alter procedure ProcTest
@City NVarchar(128)
as 
Begin
	select *
    from ParsInRows(@City,Default)
end
...
Рейтинг: 0 / 0
Reporting Не работает параметр с множественным выбором значений
    #39389463
andrst65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IDVT, спасибо за труд

select 'Москва' as City
union select 'Орел'
union select 'Казань'
union select 'Подольск'
union select 'Чехов'

@City

Осталось догадаться, как запихнуть в @City отмеченные значения в поле со списком городов.
То есть пока все то же самое.
Похожая функция-парсер у меня уже давно ждет, чтобы в @City был перечень городов через какой-нибудь знак препинания...
...
Рейтинг: 0 / 0
Reporting Не работает параметр с множественным выбором значений
    #39389477
IDVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
=)
1. создали новый отчет, настроили источник данных.
2. создали датасет1, в него разместили следующий запрос:

Код: sql
1.
2.
3.
4.
5.
      select 'Москва' as City
union select 'Орел'
union select 'Казань'
union select 'Подольск'
union select 'Чехов'



это и есть перечень значений для параметра.
3. создали параметр множественного выбора, источник данных ДатаСет1 поле значения и отображения City
4. создали в БД функцию парсера

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
create function dbo.ParsInRows
( @List NVarChar(4000)
, @Delimetr NChar(1) = N','
) Returns table as return
With [List] ([No],[Pos],[To]) as ( Select 0
                                        , 0
                                        , 0
                                   union all
                                   Select L.[NO] + 1
                                        , L.[TO] + 1
                                        , I.[TO]
                                   from  [LIST] L 
                                         cross apply (
                                                       select CharIndex( @Delimetr
                                                                       , @List + @Delimetr
                                                                       , L.[TO] + 1)) I ([To])
                                   where I.[TO] > 0
                                  )
    select [NO]
	      ,SubString(@LIST,[POS],[TO]-[POS]) as ITEM
		  ,[POS]
    from  [LIST]
    where [TO] > [POS]



5. Создали ХП'Шку, она будет результатом выполнения отчета, просто вписать запрос не получится, т.к. функция парсер принимает одну строку для парсинга и символ разделителя (по умолчанию это запятая)

Код: sql
1.
2.
3.
4.
5.
6.
7.
alter procedure ProcTest
@City NVarchar(128)
as 
Begin
	select *
    from ParsInRows(@City,Default)
end



6. в тестовом отчете создали ДатаСет2, это и будет результат отчета, он вернет выбранные значения, в настройках ДатаСета2 выбрать источник хранимая процедура и выбрать входной параметр.


-------- возможно у Вас локаль другой, в следствии разделитель выбранных значений будет не запятая, все это можно уточнить в профайлере.
...
Рейтинг: 0 / 0
Reporting Не работает параметр с множественным выбором значений
    #39389489
IDVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так будет работать быстрее в разы
1. в отчете есть DataSet1, содержит тестовый набор для параметра @City множественного выбора

Код: sql
1.
2.
3.
4.
5.
6.
7.
--- источник данных для параметра множественного выбора, DataSet1

      select 'Москва' as City
union select 'Орел'
union select 'Казань'
union select 'Подольск'
union select 'Чехов'



в настройках параметра все тоже самое что и ранее, источник DataSet1, поля City

2 В DataSet2 разместить этот код, вместе с парсером (т.е. ранее созданная функция парсера не нужна), в виде простого запроса

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
Declare @str nvarchar (128) = @STR_Report
Declare @delimetr char(1) = ','
declare @xml xml = '<b>' + RePlace( @str
                                  , @delimetr
                                  , '</b><b>') + '</b>'

select distinct y.value('.','varchar(30)') as City
from @xml.nodes('b') as x(y)


В этом же окне перейти на вкладку параметры и вписать следующее:
Имя параметра -> @STR_Report (должно подтянуться автоматом)
Значение параметра -> =Join(Parameters!City.Label, ",") где запятая будет разделитель в собранной строке, она же в лоб указана в запросе.

3. накидать табличную часть на основе ДатаСета2, там всего будет одна колонка

----
переделать под себя
...
Рейтинг: 0 / 0
Reporting Не работает параметр с множественным выбором значений
    #39389520
SQLPowerUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVT,

я бы не рекомендовал использовать XML для парсинга строки с разделителем. Если встретятся символы с кодом 0 , 1 или & < > =
то будет ошибка "Синтаксический анализ XML". Также, если строка оканчивается разделителем, как в примере ниже, то будет не совсем хорошо.
Код: sql
1.
2.
3.
4.
5.
declare @Where_ID_in varchar(max), @xml_str xml
set @Where_ID_in = 'a,b,c,d,'
set @xml_str = '<b>' + replace(@Where_ID_in, ',', '</b><b>')+'</b>'
--select @xml_str
select f.value('.', 'varchar(max)') from @xml_str.nodes('b') R(f)

Вариант с рекурсией гораздо БЫСТРЕЕ чем с xml и лишен обеих недостатков, которые были выше с xml
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
declare @str varchar(8000), @delimiter varchar(64)
declare @t table (idx int, fio varchar(500))
insert @t select 1,'Иванов' union all select 2,'Петров' union all select 3,'Сидоров' union all select 4,'Кто-то еще'
select * from @t

select @str = 'Иванов,Кто-то еще,', @delimiter = ','

;with str_nums (n1, n2, Number) as (
  select 1-len(@delimiter) [n1], charindex(@delimiter, @str+@delimiter) [n2], 0 as Number
  union all
  select n2 [n1], charindex(@delimiter, @str+@delimiter, n2+len(@delimiter)) [n2], Number+1 [Number]
  from str_nums
  where n2 < len(@str)
)
select * from @t
where fio in (select substring(@str, n1+len(@delimiter), n2-n1-1) [Value] from str_nums)


Для столбца таблицы. Тест на скорость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
set nocount on
-- Заполним тестовые данные 8000 зап.
declare @t table (Account varchar(400), Industry varchar(400))
insert @t select 'aa', '<a1234567>, s2 & 222, s35, s4' union all select 'bb', 's12,' union all select 'cc', 't1' union all select 'dd', null

;with cte as (select *, 1 [cnt] from @t union all select Account, Industry, cnt+1 from cte where cnt < 2000) insert @t select Account +' '+ cast(cnt as varchar), Industry from cte option (maxrecursion 0)

set statistics time on
;with t1 as (select Account, a = isnull(Industry,'') + ',' from @t)
,t2 as (
  select Account, cast(substring(a,t+1,8000)as varchar(8000))a,ltrim(cast(left(a,t-1)as varchar(8000))) [st], 1 [cnt]
  from t1 outer apply(select charindex(',',a)t) t
  union all
  select Account, cast(substring(a,t+1,8000)as varchar(8000)),ltrim(cast(left(a,t-1)as varchar(8000))), cnt+1
  from t2 cross apply(select charindex(',',a)t) t
  where t > 0
)
select Account,st,cnt from t2
order by Account,st
option (maxrecursion 0)
set statistics time off

set statistics time on
;with cte as (
 select Account, cast('<r><c>'+replace(replace(replace(replace(Industry, '&', '||'), '<', '(('), '>', '))'),',','</c><c>')+'</c></r>' as xml) xm 
 from @t
 )
select Account, replace(replace(replace(rtrim(ltrim(x.z.value('.', 'varchar(4000)'))), '||','&'), '((','<'), '))','>') [Industry]
from cte outer apply xm.nodes('/r/c') x(z)
order by 1,2
set statistics time off


 SQL Server Execution Times:
   CPU time = 375 ms,  elapsed time = 446 ms.

 SQL Server Execution Times:
   CPU time = 1890 ms,  elapsed time = 1947 ms.


А про функцию JOIN правильно сказано. andrst65 , на всякий случай картинка по настройке
...
Рейтинг: 0 / 0
Reporting Не работает параметр с множественным выбором значений
    #39389542
IDVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQLPowerUser,

Полностью согласен с Вами, я пока не умею готовить рекурсии...
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / Reporting Не работает параметр с множественным выбором значений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]