2015-04-14 7 views
0

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

+1

Вы не можете сделать это, используя веб-интерфейс Report Manager. Я думаю, вам нужно создать пользовательский веб-интерфейс, который может удерживать состояние и передавать параметры через SSRS оттуда. Я бы предложил изучить элемент управления ReportView для ASP.NET - это должно сделать то, что вам нужно: https://msdn.microsoft.com/en-us/library/aa337090.aspx – GShenanigan

+0

Я бы научил ваших пользователей о подписках. –

ответ

0

Функция «Мои отчеты» позволяет пользователям создавать и сохранять собственные отчеты на сервере. Он также позволяет им создавать связанные отчеты, для которых параметры по умолчанию настроены так, как они хотят. Это единственная встроенная функция, которая может получить то, что вы хотите. Правда, это довольно ограниченно, если честно.

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

Начните с таблицы для хранения значений параметров отчета пользователя.

create table UserReportParameters (
    UserName nvarchar(50), 
    ParameterSet nvarchar(50), 
    ParameterName nvarchar(50), 
    ParameterValue nvarchar(max) 
) 

Поскольку вы ищете способ хранения значений параметров пользователя, я предполагаю, что вы используете какую-то проверку подлинности на службу отчетов, таких как проверка подлинности Windows. Мы будем хранить UserName, предоставленные этой службой аутентификации, а также произвольно называемый ParameterSet. Значение ParameterSet может быть URL-адресом отчета или другим уникальным идентификатором для отчета или, возможно, логическим именем для набора отчетов, в которых используются общие параметры, такие как «Отчеты о продажах».

Нам понадобится способ сохранить эти значения параметров. Простая хранимая процедура сделает трюк.

create proc SaveUserReportParameter (
    @UserName nvarchar(50), 
    @ParameterSet nvarchar(50), 
    @ParameterName nvarchar(50), 
    @ParameterValue nvarchar(max) 
) 
as 
    delete UserReportParameters where UserName = @UserName and ParameterSet = @ParameterSet and ParameterName = @ParameterName 
    insert UserReportParameters select @UserName, @ParameterSet, @ParameterName, @ParameterValue 

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

exec SaveUserReportParameter @UserName, 'Sales Reports', 'StartDate', @StartDate 
exec SaveUserReportParameter @UserName, 'Sales Reports', 'EndDate', @EndDate 
exec SaveUserReportParameter @UserName, 'Sales Reports', 'DepartmentId', @DepartmentId 
exec SaveUserReportParameter @UserName, 'Sales Reports', 'PromoCode', @PromoCode 

Обратите внимание, что таблица хранит все как nvarchar. Я ленив здесь и допускаю неявное преобразование. Если вы хотите сохранить значения, такие как datetime в определенном формате, вам нужно будет их преобразовать при вставке их в переменную таблицы. Параметр отчета @UserName, используемый здесь и ниже, должен быть внутренним параметром, значением по умолчанию которого является =User!UserId.

Теперь, когда мы сохраняем параметры, давайте начнем их использовать. Нам понадобится еще одна хранимая процедура. Это немного больше.

create proc GetUserReportParameters (
    @UserName nvarchar(50), 
    @ParameterSet nvarchar(50), 
    @Columns nvarchar(max) 
) as 

    declare @sql nvarchar(max) 

    set @sql = ' 
    select * from 
    (
     select 
      p.ParameterName, 
      p.ParameterValue 
     from 
      (select @UserName UserName, @ParameterSet ParameterSet) stub 
      left join UserReportParameters p on p.UserName = stub.UserName and p.ParameterSet = stub.ParameterSet 
    ) v 
    pivot (
     min(ParameterValue) 
     for ParameterName in (' + @Columns + ') 
    ) as pvt' 

    exec sp_executesql @sql, N'@UserName nvarchar(50), @ParameterSet nvarchar(50)', @UserName, @ParameterSet 

А потом назвать это

exec GetUserReportParameters @UserName, 'Sales Reports', 'StartDate,EndDate,DepartmentId,PromoCode' 

Как вы можете видеть, вы обеспечиваете значения UserName и ParameterSet. То же самое, что вы использовали при вызове процедуры сохранения. Здесь, однако, вы также предоставляете строку, которая представляет собой простой список имен столбцов, разделенных запятыми. Эти имена столбцов используются сводным запросом, чтобы гарантировать, что ваш результирующий набор включает столбцы по этим именам. Вы должны знать, что эти столбцы могут содержать и содержать нули, особенно когда пользователь сначала обращается к отчету. Вы также должны знать, что все значения: nvarchar(max). Если вам нужно разобрать или преобразовать любые значения или предоставить свои собственные значения по умолчанию, когда значение равно null, вам нужно будет выполнить дополнительную работу.

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

declare @Parameters table (
    StartDate datetime, 
    EndDate datetime, 
    DepartmentId int, 
    PromoCode nvarchar(50) 
) 

insert @Parameters 
exec GetUserReportParameters @UserName, 'Sales Reports', 'StartDate,EndDate,DepartmentId,PromoCode' 

select 
    isnull(cast(StartDate as datetime), dateadd(day,datediff(day,0,getdate()),0)) StartDate, 
    isnull(cast(EndDate as datetime), dateadd(day,datediff(day,0,getdate()),0)) EndDate, 
    isnull(cast(DepartmentId as int),15) DepartmentId, 
    isnull(PromoCode,'FAKESALE') PromoCode 
from @Parameters 

Теперь, каждый раз, когда вы запускаете отчет (более конкретно, каждый раз, когда набор данных, содержащий ваш вызов процедуры сохранения выполняется) параметры, которые вы решили сохранить будут сохранены. Когда вы уйдете и вернитесь на страницу отчета, параметры будут заполнены последними выбранными вами значениями. Обратите внимание, что вам не нужно сохранять каждое значение параметра. Только те, которые вы хотите сохранить для каждого пользователя. Вам также не нужно использовать каждое значение параметра, сохраненное в заданном ParameterSet. Если у вас есть два отчета о продажах, один из которых использует PromoCode и тот, который использует ProductCategory, вы можете сохранить оба значения их параметров в наборе параметров продаж, не опасаясь, что они будут мешать друг другу. Кроме того, вы могли бы легко создать два отдельных набора данных в своем отчете, каждый из которых вытягивает другой набор параметров. Например, если PromoCode фактически сохраняется в наборе параметров «Маркетинг», а DepartmentId - из набора параметров Products. Когда у вас есть эта структура, у вас есть большая гибкость в том, как сохраняются ваши настройки параметров пользователя.

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

СКОРОСТЬ - Это отлично подойдет для небольшого количества отчетов для относительно небольшого числа пользователей. В более крупных корпоративных средах могут возникать проблемы с производительностью. (Вот почему я назвал это «рудиментарным примером» в начале.) Вы могли бы решить эту проблему, переработав механизм хранения значений. Например, используйте предварительно определенные таблицы для каждого набора параметров вместо того, чтобы сбрасывать их все в одну таблицу, чтобы избежать поворота. Я оставлю это решение и буду работать с вами.