Построитель отчетов SQL Server 2005 Как динамически изменять источник данных? - PullRequest
4 голосов
/ 11 мая 2009

Нам необходимо иметь возможность динамически изменять источник данных для отчета, созданного / управляемого в построителе отчетов. По сути, это та же структура БД, но у каждого клиента есть своя БД, поэтому в зависимости от параметра для ClientID ему необходимо динамически перейти к соответствующей БД.

У кого-нибудь есть для этого хорошие решения?

Ответы [ 2 ]

1 голос
/ 11 мая 2009

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

  • Создать папку для каждого клиента на сервере отчетов. Установите соответствующие разрешения, чтобы клиенты не могли запускать отчеты друг друга. Поместите папку в эту папку под названием «Источники данных» или что-то подобное и поместите все источники данных отчетов в эту папку. Это означает, что любой инструмент, который программно переподключает источники данных, точно знает, где находится источник данных относительно отчета. Обратите внимание, что источники данных также должны иметь конкретные, предсказуемые имена.

  • Напишите небольшое приложение .net для развертывания отчетов, источников данных и моделей отчетов. Это проще, чем кажется, поскольку SSRS экспортирует довольно простой веб-сервис для этого.

  • IronPython - неплохой способ поэкспериментировать с этим веб-сервисом и выяснить, как им управлять. Для этого вам нужно использовать генератор оболочки WSDL (WSDL.EXE IIRC) и сделать несколько заглушек на C #. Скомпилируйте заглушки и зарегистрируйте библиотеку с помощью IronPython. Затем используйте интерактивную оболочку для экспериментов с API веб-сервисов. Перепишите в C #, если вы чувствуете, что склонны.

  • Существует также инструмент, связанный с SSRS, который называется rs.exe, который берет файл VB.net, обрабатывает его и компилирует его, чтобы вы могли использовать VB.net для написания скриптов, которые работают с сервером отчетов. .

Это приложение .net будет развертывать отчеты и подключать источники данных. Настройте его так, чтобы он мог развертываться в любой заданной папке. Когда вы настраиваете клиента, настройте его источники данных в папке «Источники данных», которую вы настраивали при создании их папки. Вы можете программно развернуть файл отчета и подключить к нему источник данных в несколько строк кода. Разверните отчеты в папке клиента.

Параметризованный именем сервера и каталогом из командной строки, приложение может развернуть отчет и подключить свои источники данных к тому, который находится в папке «Источники данных». Ссылки на источники данных в отчетах могут иметь относительные пути, поэтому отчеты могут быть в блаженном неведении об их положении в иерархии.

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

Развертывание моделей отчетов аналогично, но имеет дополнительные особенности. Одним из свойств модели отчетов является список отчетов, которые зависят от него. Вам нужно будет захватить этот список (опять же, это просто сделать программно) и повторно подключить отчеты к источнику данных (модель отчета является источником данных для этих отчетов).

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

1 голос
/ 11 мая 2009

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

CREATE PROCEDURE ProcedureName 
    -- Add the parameters for the stored procedure here
    @clientName nvarchar(100)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here

declare @sql nvarchar(max)

set @sql='select * from ' + @clientName + '.dbo.Products'

exec(@sql)


END
GO
...