SSRS: Copiando Reportes de una Carpeta a Otra

Hace un par de días me toco atender un requerimiento, el cual requería copiar una carpeta y sus reportes de SSRS dentro del mismo Report Server, pero actualizando el Datasource para que apunte a otra base de datos. Yo pensé que eso se podía hacer simplemente con alguna opción del mismo portal de SSRS, pero para mi sorpresa, esto no era posible con alguna opción nativa, así que me propuse realizarlo con el modulo de Powershell dedicado a Reporting Services.

Lo primero es la instalación, este modulo de Powershell ya se encuentra en la galería de Powershell, así que su instalación es bastante sencilla:

install-module ReportingServicesTools

Ahora, una vez que esta instalado el módulo, lo importamos e iniciamos el proceso de copiado. Según lo que revise en algunas paginas, lo primero seria crear la nueva carpeta, luego debería descargar los reportes desde SSRS hacia mi maquina local, para luego subirlos todos a la carpeta nueva, donde finalmente debería cambiar el Datasource para que este apunte a la nueva base de datos. Sin embargo, cuando intente hacer la descarga me salieron algunos errores, los cuales no me permitieron descargar los reportes.

2018-09-13 12_33_11-Window

Sin embargo, encontré otra manera de hacer la descarga de los reportes, simplemente cambie el código original por un “foreach” y todo funciono de manera correcta.

# Definir algunas variables
$rsuri = 'http://MiServidorSSRS/ReportServer'
# Guardar los reportes de la carpeta original en una variable
$reports = Get-RsFolderContent ReportServerUri $rsuri RsFolder '/CarpetaOriginal' |
Where-Object TypeName -EQ 'Report'
# Descargar los reportes en una carpeta local
$reports | ForEach-Object { Out-RsCatalogItem ReportServerUri $rsuri RsItem $_.Path Destination 'F:\Tmp\SSRS' }

Una vez que tenia los reportes localmente, simplemente debía subirlos a la nueva carpeta en SSRS previamente creada, para ello se utilizo el siguiente código:

# Declaro algunas variables
$rsuri = 'http://MiServidorSSRS/ReportServer'
$CarpetaLocal = 'F:\Tmp\SSRS'
$CarpetaDestinoSSRS = '/NuevaCarpeta'
# Cargo los reportes
Write-RsFolderContent ReportServerUri $rsuri Path $CarpetaLocal Destination $CarpetaDestinoSSRS Verbose

Luego de que los reportes han sido subidos, el siguiente paso seria actualizar el datasource de cada uno de los reportes, esto se podría hacer utilizando el portal, sin embargo, requiere trabajo manual y yo tenia más de 50 reportes a los cuales debía actualizar el Datasource, esto era demasiado trabajo, así que hice el siguiente script para cambiar el Datasource de todos los reportes por uno nuevo.

# Declaro algunas variables
$NuevoDS = '/NuevaCarpeta/Data Sources/Default'
$rsuri = 'http://MiServidorSSRS/ReportServer'
$NuevaCarpetaSSRS = '/NuevaCarpeta'
# Obtengo los reportes de la Nueva carpeta SSRS
$reports = Get-RsFolderContent ReportServerUri $rsuri RsFolder $NuevaCarpetaSSRS | Where-Object TypeName -EQ 'Report'
# Cambio el Datasource que tiene por el nuevo DS
$reports | ForEach-Object {
# Obtengo el antiguo DS por cada reporte
$oldds = Get-RsItemDataSource RsItem $_.Path ReportServerUri $rsuri | Select-Object ExpandProperty Name;
# Actualizo el DS del reporte
Set-RsDataSourceReference Path $_.Path DataSourceName $oldds DataSourcePath $NuevoDS ReportServerUri $rsuri ;
}

Probablemente existan mejores maneras de hacer esto, pero a mi me funciono bastante bien, me ahorro mucho tiempo y lo mejor de todo aprendí a utilizar el modulo oficial de Powershell para Reporting Services. Espero les sea de utilidad este post.

 

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s