Ласкаво просимо до dev.net.ua Увійти | Приєднатися | Допомога

Динамическое добавление и удаление столбцов в отчете

             Создание одного отчета вместо нескольких иногда может спасти не только ваше время, но и нервы, которые необходимо будет потратить на то, чтобы выслушивать как не удобно искать второй, а иногда и десятый отчет. Используя данную технику, мы будем использовать параметризованные выражения, которые будут модифицировать dataset так, чтобы он возвращал разные наборы колонок. Давайте для начала, используя SQL Server Management Studio, выполним несколько скриптов, которые нам помогут справиться с этой задачей (Все действия мы будем совершать на базе тестовой базы данных AdwentureWorksDW2008R2).

T-SQL Скрипт №1

create proc spResellerSales1
    @DateFrom    int,
    @DateTo    int
as
    select
        d.CalendarYear, d.CalendarQuarter, d.EnglishMonthName as Month
        , sum(fs.OrderQuantity) as OrderQuantity
        , sum(fs.SalesAmount) as SalesAmount
    from
        FactResellerSales fs inner join DimDate d on fs.OrderDateKey = d.DateKey
         join DimProduct p on fs.ProductKey = p.ProductKey
         join DimProductSubcategory ps
on p.ProductSubcategoryKey = ps.ProductSubcategoryKey
         join DimProductCategory pc
on ps.ProductCategoryKey = pc.ProductCategoryKey
    where d.DateKey between @DateFrom and @DateTo
    group by d.CalendarYear, d.CalendarQuarter, d.EnglishMonthName
, d.MonthNumberOfYear
    order by d.CalendarYear, d.CalendarQuarter, d.MonthNumberOfYear
;
go

T-SQL Скрипт №2

create proc spResellerSales2
    @DateFrom    int,
    @DateTo    int
as
    select
        d.CalendarYear, d.EnglishMonthName as Month
        , sum(fs.OrderQuantity) as OrderQuantity
, sum(fs.SalesAmount) as SalesAmount
    from
        FactResellerSales fs inner join DimDate d on fs.OrderDateKey = d.DateKey
        inner join DimProduct p on fs.ProductKey = p.ProductKey
        inner join DimProductSubcategory ps
on p.ProductSubcategoryKey = ps.ProductSubcategoryKey
        inner join DimProductCategory pc
on ps.ProductCategoryKey = pc.ProductCategoryKey
    where d.DateKey between @DateFrom and @DateTo
    group by d.CalendarYear, d.EnglishMonthName, d.MonthNumberOfYear
    order by d.CalendarYear, d.MonthNumberOfYear
;
go

Как видите, эти скрипты создают две процедуры, из которых первая возвращает колонку CalendarQuarter, а вторая нет. Данный пример достаточно тривиален, но на основании этого вы ,в принципе, можете использовать процедуры, которые будут возвращать любое количество колонок и даже более того- любых колонок.

Для начала давайте создадим отчет, используя Business Intelligence Development Studio. Создадим как всегда DataSource, после этого создадим отчет. Внутри отчета создадим DataSet, здесь-то и начинается самое интересное.  При создании DataSet мы выбираем первую хранимую процедуру.


После этого, видим что в окне ReportData создались два параметра(собственно, как всегда)


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


После этого модифицируем немного наш DataSet для того, чтобы он мог принимать в качестве хранимой процедуры наш параметр. Для этого в свойствах нашего DataSet изменяем имя хранимой процедуры на выражение “=Parameters!Procedure.Value”.


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


И осталось еще модифицировать ту колонку которая, будет пропадать при выборе другого источника. Для этого возьмем ту колонку которая нам необходима, а именно CalendarQuarter, и вызовем из контекстного меню Column Visibility. Внутри нам необходимо установить следующую настройку:


После нажатия на кнопку ОК все готово. Теперь попробуем сгенерировать оба наших отчета.

 

Отчет №1(В котором есть колонка CalendarQuarter)


Отчет №2(В котором нет колонки CalendarQuarter)


Вот такая забавная техника, которую вы можете использовать во благо вашим нервам. Эта техника подходит и для более ранних версий SQL Server Reporting Services(Только сами окна могут изменяться).

Спасибо всем за внимание)))

Опубліковані Saturday, November 27, 2010 10:03 PM від Andrey Klochaniy

Коментарі

# Дайджест Технических материалов по разработке ПО (Ноябрь)

В первую очередь следует упомянуть о прошедшей конференции Платформа 2011 . Материалы конференции будут

Thursday, December 2, 2010 7:02 AM by Алексей Майоров

# SQL ?? ?????????????????? ????????????: ???????????????? ?????????????? « SQL4Enterprise

Анонімні коментарі деактивовані. Увійдіть або Зареєструйтесь щоб мати доступ до ресурсів Спільноти.