Передача нескольких значений в параметр вложенного отчета SSRS

#sql-server #reporting-services #ssrs-2012

#sql-сервер #службы отчетов #ssrs-2012

Вопрос:

У меня есть отчет, в котором отображаются сведения о продукте. Некоторые из этих продуктов будут дочерними по отношению к родительским продуктам. Дочерние элементы имеют 3 столбца Parent1 Parent2 и Parent3 .

Вложенный отчет выполняет тот же запрос, за исключением переменной @ParentCodes . Это значение задается как varchar(max) . Затем я использую функцию в предложении where для разделения кодов, которые могут быть переданы ParentCode in (SELECT [Value] FROM dbo.SplitMultiValueParameterString(@ParentCodes, ','))

Если я передаю 2 или 3 кода в строке типа ('123', '456') , то запрос возвращает требуемые 2 строки.

Я изо всех сил пытаюсь заставить это работать в SSRS. Я настроил оба отчета и добавил @ParentCodes параметр во вложенный отчет.

В основном отчете я использую действие в текстовом поле для перехода к вложенному отчету и передачи параметра @ParentCodes со следующим значением выражения =Fields!Parent1.Value amp; Fields!Parent2.Value amp; Fields!Parent3.Value

Во вложенном отчете на вкладке параметров в наборе данных я добавил @ParentCodes параметр и, используя выражение =JOIN(Parameters!ParentCodes, ",")

Это работает не так, как хотелось бы, может кто-нибудь понять, что я пытаюсь сделать, и предложить решение?

Ответ №1:

В SSRS, если вы используете прямые инструкции (в том смысле, что вы просто добавляете необработанный SQL в данные отчета), тогда вам нужно использовать IN , и SSRS (как бы я этого не ненавидел) «безопасно» заменяет переменную в IN введением параметров. Проще говоря, выполните запрос, подобный приведенному ниже:

 SELECT *
FROM dbo.YourTable
WHERE ID IN (@ID);
  

Затем вы выбираете параметры, 1 , 2 3 , 4 и,, в отчете. Он будет вводить их, и запрос станет следующим:

 SELECT *
FROM dbo.YourTable
WHERE ID IN (1,2,3,4);
  

Однако, если вы используете хранимую процедуру, вам необходимо использовать разделитель строк (например, DelimitedSplit8k_LEAD ) для выполнения работы и сделать ваш параметр (n)varchar :

 CREATE PROC dbo.YourProc @IDs varchar(8000) AS
BEGIN

SELECT *
FROM dbo.YourTable YT
     JOIN dbo.DelimitedSplit8k_LEAD(@IDs, ',') DS ON YT.ID = DS.item;
  

Ответ №2:

Похоже, вы ожидаете, что запрос будет выполнять динамический SQL в вложенном отчете, который не будет работать, но SSRS должен делать то, что вам нужно.

Попробуйте это с вашим вложенным отчетом с несколькими родительскими кодами.

В вашем предложении where во вложенном отчете вы должны быть в состоянии сделать это:

ГДЕ родительский код В (@parentcodes)

Возможно, вам потребуется настроить выражение соединения в соответствии с this: article, но это может просто сработать.

Ответ №3:

Если я вас правильно понял, вложенный отчет принимает в качестве параметра одну строку, разделенную запятой, и она заполняется из основного отчета?

Если это так, то ваше выражение

 =Fields!Parent1.Value amp; Fields!Parent2.Value amp; Fields!Parent3.Value
  

это неправильно, так как в нем нет никаких разделителей, поэтому 123 и 456 будут отправлены как 123456.

Вам, вероятно, нужно что-то вроде

 =Fields!Parent1.Value amp; "," amp; Fields!Parent2.Value amp; "," amp; Fields!Parent3.Value
  

Другим вариантом было бы просто передать идентификатор дочернего продукта, а затем получить родительский идентификатор в запросе вложенного отчета. Вам не нужно было бы выполнять какую-либо обработку, чтобы построить или разделить значения параметров таким образом.

Комментарии:

1. Я обновил выражение в соответствии с вашим предложением, сообщения об ошибке больше нет, но во вложенном отчете нет данных. Также, если родительский код отсутствует, значение в наборе данных равно null. Может ли это быть проблемой?

2. Значение параметра, передаваемое во вложенный отчет для экземпляра дочернего элемента с 2 родителями, является 123,456,

3. Вероятно, вам нужно отредактировать свой вопрос и показать запрос к набору данных или, по крайней мере, его важные фрагменты. Также включите образец записи / строки, как это будет отображаться в главном отчете, включая дочерний продукт, поскольку я думаю, что все это можно упростить