#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. Вероятно, вам нужно отредактировать свой вопрос и показать запрос к набору данных или, по крайней мере, его важные фрагменты. Также включите образец записи / строки, как это будет отображаться в главном отчете, включая дочерний продукт, поскольку я думаю, что все это можно упростить