.

Сменив местоположение базы данных и применив исходный ключ шифрования к новому экземпляру, необходимо изменить источники данных, указав новые пути к исходным базам данных, что может потребовать корректировки соответствующих запросов в отчетах. Было бы замечательно, если бы мы во всех своих отчетах использовали хранимые процедуры, но такое мне пока не встречалось. Привести отчеты в состояние рабочей готовности после обновления удобнее всего путем прямого внесения изменений в файл описания отчета (RDL) в текстовом редакторе и последующей загрузки измененного файла RDL в службы отчетов Reporting Services.

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

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

 

Работа со службами отчетов
Экран 1. Работа со службами отчетов

Для этого к веб-службе сначала нужно подключиться, что мы и делаем с помощью языка описания веб-служб (WSDL):

$url = 'http://localhost/ReportServer/ReportService2010.asmx?WSDL'
$ssrs = New-WebServiceProxy -uri $url -UseDefaultCredential -Namespace «ReportingWebService»

У веб-службы ReportService2010 есть метод ListChildren(), позволяющий пройти всю структуру папок служб отчетов. Узнать, какие имеются отчеты и под какой структурой папок они находятся, проще всего с помощью запроса к таблице Catalog базы данных ReportServer. В таблице есть столбец 'Type', где значение 2 указывает на отчет. Делаем следующий запрос:

SELECT Path
FROM dbo.Catalog
WHERE Type = 2

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

Path
/AdventureWorks/Person Reports/Contacts
/AdventureWorks/Product Reports/Products
/AdventureWorks/Sales Reports/Stores
/Performance Reports/Performance Analysis Reports/ComparativeAnalysis
/Performance Reports/Performance Analysis Reports/PerformanceAnalysis
/Performance Reports/Resource Utilization Reports/DatabaseSpaceAnalysis
/Performance Reports/Resource Utilization Reports/DiskUsageAnalysis

Теперь с использованием этого значения Path можно из полного списка отчетов извлечь тот отчет, в который нужно внести изменения.

Предположим, что требуется изменить запрос в отчете ComparativeAnalysis. Первое, что мы делаем – применяем метод ListChildren() веб-службы и выводим список отчетов. Метод возвращает набор значений, которые мы подаем по конвейеру на вход команде where-object, чтобы найти объект с нужным именем и извлечь сам отчет. Результат показан на экране 2.

 

Изменение запроса в отчете
Экран 2. Изменение запроса в отчете
$reports = $ssrs.ListChildren('/Performance Reports/Performance Analysis Reports', $false)
$r = $reports | where-object {$_.Name -eq 'ComparativeAnalysis'}

Теперь переменная $r хранит объект-отчет. Его описание можно извлечь с помощью метода GetItemDefinition():

$def = $ssrs.GetItemDefinition($r.path)

Наконец, с использованием метода File.OpenWrite из пространства имен. NET System.IO можно записать описание отчета в нужный файл:

$stream = [system.io.file]::OpenWrite('c:\Work\ComparativeAnalysis.rdl')
$stream.write($def, 0, $def.length)
$stream.close()

Файл RDL – это файл XML, содержащий полное описание отчета. Теперь файл можно отредактировать, внеся необходимые изменения в запрос, и загрузить обратно в службы отчетов для реализации внесенных изменений. Хотя это и не укладывается в установленные рамки жизненного цикла разработки программного обеспечения, но все же позволяет осуществить необходимые изменения для быстрой реализации проекта модернизации. При должном информировании и документировании внесенных изменений разработчики отчетов смогут внести соответствующие корректировки в удобное для них время.