Как мне представить неизвестное количество столбцов в SSRS? - PullRequest
9 голосов
/ 20 мая 2009

Я работаю над довольно сложным отчетом в Sql Server Reporting Services. Мой SP возвращает динамическое количество столбцов, каждый из которых имеет динамическое имя.

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

У меня есть SP, который возвращает все это. Он делает это путем создания небольшого динамического SQL с помощью оператора exec (уродливо, я знаю, но я нахожусь на SQL 2000, поэтому опция PIVOT не будет работать)

У меня может быть неопределенное количество сегментов, и может отображаться любое или все.

Я нашел это - http://www.codeproject.com/KB/reporting-services/DynamicReport.aspx - что полезно, но в примере у него есть конечное число столбцов, и он просто скрывает или показывает их в соответствии с тем, какие из них имеют значения. В моем случае у меня есть переменное количество столбцов, так что каким-то образом мне нужен отчет для добавления столбцов.

Есть мысли?

Ответы [ 5 ]

10 голосов
/ 12 августа 2010

Пока вы знаете максимальное количество столбцов, это можно делать по моде.

Сначала назовите столбцы с результатом вашего запроса, чтобы вы могли либо передать его в запрос, либо получить его там. Во-вторых, просто создайте отчет, как если бы он содержал максимальное количество столбцов, и скройте их, если они пусты.

Например, мне нужно было создать отчет, в котором были бы указаны месячные цифры продаж за год, но месяцы не обязательно начинались в январе. Я вернул название месяца в одном столбце, а затем номера для своего отчета. На .rdl я построил 12 наборов столбцов, по одному на каждый возможный месяц, и просто использовал выражение, чтобы скрыть столбец, если он был пустым. В результате отчет расширится до необходимого количества столбцов.

Конечно, он не очень динамичен в том смысле, что может расширяться настолько, насколько вам нужно, не зная верхней границы.

8 голосов
/ 16 июля 2011

Это можно сделать. Я сделал это, и он работает нормально. Вам не нужно знать максимальное количество столбцов или показывать и скрывать столбцы в моем подходе. Используйте матрицу и измените ваш sp, чтобы вернуть динамические данные в структуру, упомянутую в этом сообщении в блоге http://sonalimendis.blogspot.com/2011/07/dynamic-column-rdls.html

4 голосов
/ 18 октября 2012

Я думаю, что лучший способ сделать это - добавить все столбцы в вашей таблице и отредактировать свойство видимости для него с помощью аргументов, которые вы получаете от своего SP. В отчете вы получите много пустого пространства, которое можно решить с помощью SSRS - Сохраняйте таблицу такой же ширины при динамическом скрытии столбцов? и ваш отчет будет готов

4 голосов
/ 10 мая 2012

Создание 2 связанных наборов данных, первый для содержимого отчета, а второй для списка меток его столбцов.

Набор данных содержимого отчета должен иметь фиксированное количество столбцов и имя. Вы можете выделить максимальное количество столбцов.

В этом примере у меня есть первые 2 столбца как фиксированные или всегда видимые, и максимум 4 столбца, которые должны отображаться по выбору через многозначный параметр или зависит от условий запроса. И, как обычно, мы можем иметь общее количество. Итак, это может выглядеть так:

Fixed01, Fixed02, Dyna01, Dyna02, Dyna03, Dyna04, Total

Второй набор данных со своими значениями будет выглядеть так:

Name    Label
----    -----
Dyna01  Label01
Dyna02  Label02
Dyna03  Label03

Я опустил 4-ю метку, чтобы продемонстрировать, что не все столбцы используются определенным условием запроса. Помните, что оба набора данных должны быть связаны с одним и тем же запросом.

Теперь создайте параметр с именем, скажем, @columns; заполните его Доступные значения и Значения по умолчанию вторым набором данных.

Для каждого из этих 4 динамических столбцов установите видимость столбца с помощью следующего выражения:

=IIf(InStr(join(Parameters!columns.Value,","),"Dyna01"),false,true)

И для каждого из их текстовых полей заголовка столбца используйте следующее выражение:

=Lookup("Dyna01", Fields!Name.Value, Fields!Label.Value, "dsColumns")

Что касается итога, вот выражение для его видимости:

=       IIf(InStr(join(Parameters!columns.Value, ","), "Dyna01"), false, true)
AndAlso IIf(InStr(join(Parameters!columns.Value, ","), "Dyna02"), false, true)
AndAlso IIf(InStr(join(Parameters!columns.Value, ","), "Dyna03"), false, true)
AndAlso IIf(InStr(join(Parameters!columns.Value, ","), "Dyna04"), false, true)

А вот для его значений:

= IIf(InStr(join(Parameters!columns.Value, ","), "Dyna01"), Fields!C01.Value, 0)
+ IIf(InStr(join(Parameters!columns.Value, ","), "Dyna02"), Fields!C02.Value, 0)
+ IIf(InStr(join(Parameters!columns.Value, ","), "Dyna03"), Fields!C03.Value, 0)
+ IIf(InStr(join(Parameters!columns.Value, ","), "Dyna04"), Fields!C04.Value, 0)

Это все, надеюсь, это поможет.

Бонус, второй набор данных, dsColumns, также может содержать другие атрибуты столбца, такие как: цвет, ширина, шрифты и т. Д.

0 голосов
/ 20 мая 2009

В прошлом мне приходилось делать это, и я пришел к выводу: «Вы не можете», однако я не уверен в этом. Если вы найдете решение, я бы хотел бы услышать об этом.

Проблема, которая приходит на ум, заключается в том, что вам нужно определить отчет, используя имена столбцов, которые вы собираетесь получить из хранимого процесса, и если вы не знаете этих имен или их количество как вы можете определить отчет?

Единственная идея о том, как это сделать, - это динамическое создание определения отчета (файл .rdl) через C #, но в то время я не смог найти для этого MS API, и я сомневаюсь один существует сейчас. Я нашел один с открытым исходным кодом, но я не следовал по этому пути.

...