.
Сменив местоположение базы данных и применив исходный ключ шифрования к новому экземпляру, необходимо изменить источники данных, указав новые пути к исходным базам данных, что может потребовать корректировки соответствующих запросов в отчетах. Было бы замечательно, если бы мы во всех своих отчетах использовали хранимые процедуры, но такое мне пока не встречалось. Привести отчеты в состояние рабочей готовности после обновления удобнее всего путем прямого внесения изменений в файл описания отчета (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, содержащий полное описание отчета. Теперь файл можно отредактировать, внеся необходимые изменения в запрос, и загрузить обратно в службы отчетов для реализации внесенных изменений. Хотя это и не укладывается в установленные рамки жизненного цикла разработки программного обеспечения, но все же позволяет осуществить необходимые изменения для быстрой реализации проекта модернизации. При должном информировании и документировании внесенных изменений разработчики отчетов смогут внести соответствующие корректировки в удобное для них время.