ola a todos,

En este artículo vamos a explicar cómo automatizar el despliegue de informes de Reporting Services mediante la ejecución de scripts de PowerShell.

El script que vamos a crear leerá los informes que deseamos publicar en nuestro servidor de una carpeta y realizará el despliegue asignándole un origen de datos que le corresponda (el origen de datos debe estar creado con anterioridad).

Cómo automatizar el despliegue de informes de Reporting Services mediante la ejecución de scripts de PowerShell.

Vamos a trabajar principalmente con 2 archivos:

  • Un fichero de configuración donde están los datos de conexión al server de reporting
    • DespliegueSSRS.cfg
  • El script principal PowerShell de ejecución.
    • PS_Lab04_DeploySSRS.ps1

Para poder desplegar informes vamos a usar una librería de power Shell llamada ReportingServicesTools. Primero debemos instalarla mediante el comando:

Install-Module -Name ReportingServicesTools

Podemos ver todas las funciones que contiene mediante el comando:

Automatizar el Despliegue de Informes de SSRS con PowerShell

Si al instalar os sale este error:

[DBG]: PS C:\Windows\system32>> Install-Module -Name ReportingServicesTools
Install-Module : El término 'Install-Module' no se reconoce como nombre de un cmdlet, función, archivo de script o programa ejecutable. Compruebe si escribió
correctamente el nombre o, si incluyó una ruta de acceso, compruebe que dicha ruta es correcta e inténtelo de nuevo.

Debéis instalar el administrador de paquetes, lo podéis bajar de la página de microsfot, en la url:

https://www.microsoft.com/en-us/download/details.aspx?id=51451

Una vez tenemos el entorno preparado pasamos a analizar el script que vamos a usar:

Nuestro fichero de parámetros tiene el siguiente contenido:

ServerName = SQLBI
SSRSInstance = MSSQLSERVER
SSRSURL = http://sqlbi/reportserver/
FolderFromDeploy = C:\ReportsToDeploy\
FolderToDeploy = /ReportsFolder

Donde vemos parametrizados los siguientes elementos:

  • ServerName: Nombre del servidor donde esta albergado el SSRS
  • SSRSInstance: Nombre de la instancia de SQL Server, por defecto es MSSQLSERVER
  • SSRSURL: La URL donde se almacenan los informes por defecto es bajo la carpeta “reportserver”
  • FolderFromDeploy: ruta de la carpeta donde están los informes .rdl o .rds que vamos a desplegar
  • FolderToDeploy: Nombre de la carpeta del servidor donde deseamos desplegar

 

Los pasos que sigue el script son los siguientes:

Primero cargamos el fichero de configuración en una tabla hash:

$pRutaFicheroParam = "C:\PowerShell\DespliegueSSRS.cfg"
$ConfigParam = @{}
Get-Content $pRutaFicheroParam | foreach 
            {
      $line = $_.split("=")
      $ConfigParam.($line[0].Trim()) = $line[1].Trim()
      }

Conectamos con el servidor:

Connect-RsReportServer -ComputerName $ConfigParam.ServerName -ReportServerInstance $ConfigParam.SSRSInstance -Uri $ConfigParam.SSRSURL

Creamos la carpeta donde desplegaremos los informes si no existe:

Try
{
    New-RsFolder -ReportServerUri $ConfigParam.SSRSURL -Path / -Name $ConfigParam.FolderToDeploy -Verbose
}
catch
{
    if ($_.Exception.HResult -eq -2146233088)
    {
        Write-Host  ("La Carpeta " + $ConfigParam.FolderToDeploy +  " ya existe" )
    }
    else
    {
        $ErrorMessage = $_.Exception.Message
        LogWrite -Text $ErrorMessage -Color Red
        break
    }
}

La siguiente instrucción carga en una variable la lista de informes que hay en la carpeta que vamos a desplegar y luego nos da a elegir, mediante un menú emergente, los informes que queremos enviar.

$ValidFiles = Get-ChildItem ($ConfigParam.FolderFromDeploy + "*") -Include *.rdl, *.rsd
$FilesToDeploy =  $ValidFiles  | Out-GridView -PassThru

El menú desplegable tiene el siguiente aspecto:

Automatizar el Despliegue de Informes de SSRS con PowerShell

Los nombres de los informes seleccionados se guardan en la variable $FilesToDeploy.

Luego obtenemos la lista de informes que contiene la carpeta del portal de informes (carpeta de destino) donde vamos a desplegar y publicamos los informes contenidos en la variable $FilesToDeploy, si el informe ya existe se borra antes de copiarlo.

$Reports = Get-RsFolderContent -ReportServerUri $ConfigParam.SSRSURL -RsFolder $ConfigParam.FolderToDeploy

foreach ($File in $FilesToDeploy)
{
    $ExistReport = $Reports | Where Name -eq ($File.Name.Replace(".rdl","").Replace(".rsd",""))
    if ($ExistReport -ne $null)
    {
        Remove-RsCatalogItem -ReportServerUri $ConfigParam.SSRSURL -RsFolder $ExistReport.Path
        Write-RsCatalogItem -ReportServerUri $ConfigParam.SSRSURL -Destination ($ConfigParam.FolderToDeploy) -OverWrite -Path ($ConfigParam.FolderFromDeploy + $File.Name)
        Write-Host  ("    Se ha recreado el informe: " + ($ConfigParam.FolderFromDeploy + $File.Name) + " en la ruta del server: "+ ($ConfigParam.FolderToDeploy +"/" + $File.Name.Replace(".rdl","").Replace(".rsd","")) )
    }
    else
    {
        Write-RsCatalogItem -ReportServerUri $ConfigParam.SSRSURL -Destination ($ConfigParam.FolderToDeploy) -OverWrite -Path ($ConfigParam.FolderFromDeploy + $File.Name)
        Write-Host  ("    Se ha creado el informe: " + ($ConfigParam.FolderFromDeploy + $File.Name) )
    }
}

Por último para cada informe establecemos su origen de datos. Cada informe puede tener uno o más orígenes de datos, lo que hacemos es recorrer mediante un bucle “for” todos los informes y restablecerle sus orígenes de datos.

En este ejemplo en el servidor existen 2 orígenes de datos uno que conecta con la base de datos relacional y otro que conecta con un cubo OLAP Los informes que publicamos pueden usar el origen relacional, el olap o los dos.

Lo que hacemos es intentar establecer los 2 orígenes de datos a todos los informes que vamos a desplegar, pero controlamos el error de modo que si un informe no hace uso de uno de los orígenes de datos no salte el error.

$Reports = Get-RsFolderContent -ReportServerUri $ConfigParam.SSRSURL -RsFolder ($ConfigParam.FolderToDeploy) 

foreach ($Report in $Reports )
{
  if ($Report.TypeName -eq "Report") 
  {
    Try{Set-RsDataSourceReference -Path $Report.Path -DataSourceName Comercial   -DataSourcePath "/Origenes de Dato/DW_Comercial"}
    Catch
    {
      if( $_.Exception.hresult -ne -2146233087)
      {
        $ErrorMessage = $_.Exception.Message
        Write-Host  ($ErrorMessage)
        break
      }
    }
  }
  if ($Report.TypeName -eq "Report") 
  {
    Try{Set-RsDataSourceReference -Path $Report.Path -DataSourceName CubeComercial   -DataSourcePath "/Origenes de Datos/DW_Comercial_Cube"}
    Catch
    {
      if( $_.Exception.hresult -ne -2146233087)
      {
        $ErrorMessage = $_.Exception.Message
        Write-Host  ($ErrorMessage)
        break
      }           
    }
  }
}
Write-Host  ("Se ha Establecido los datasources correctamente")

 

El script completo es el siguiente:

#Establecemos variables de inicio (Parametros)
    $pRutaFicheroParam = "C:\PowerShell\DespliegueSSRS.cfg"

#Cargamos un array con los datos de los parametros del fichero pRutaFicheroParam
#-----------------------------------------------------------------------------
    $ConfigParam = @{} # Tabla de hash para guardar los pares Parametro - Valor
    Get-Content $pRutaFicheroParam | foreach {
      $line = $_.split("=")
      $ConfigParam.($line[0].Trim()) = $line[1].Trim()
      }
#-----------------------------------------------------------------------------

#Conectamos con el servidor de Reporting Services
#-----------------------------------------------------------------------------
    Connect-RsReportServer -ComputerName $ConfigParam.ServerName -ReportServerInstance $ConfigParam.SSRSInstance -Uri $ConfigParam.SSRSURL
#-----------------------------------------------------------------------------

#Creamos una carpeta para almacenar los informes y sus datasets
#-----------------------------------------------------------------------------
    Try
    {
        New-RsFolder -ReportServerUri $ConfigParam.SSRSURL -Path / -Name $ConfigParam.FolderToDeploy -Verbose
    }
    catch
    {
        if ($_.Exception.HResult -eq -2146233088)
        {
            Write-Host  ("La Carpeta " + $ConfigParam.FolderToDeploy +  " ya existe" )
            
        }
        else
        {
            $ErrorMessage = $_.Exception.Message
            LogWrite -Text $ErrorMessage -Color Red
            break
        }
    }
#-----------------------------------------------------------------------------

#Elegimos los Reports de una carpeta seleccionandolos mediante una ventana
#-----------------------------------------------------------------------------
$ValidFiles = Get-ChildItem ($ConfigParam.FolderFromDeploy + "*") -Include *.rdl, *.rsd

$FilesToDeploy =  $ValidFiles  | Out-GridView -PassThru

#-----------------------------------------------------------------------------


#Obtenemos la lista de informes publicados
#-----------------------------------------------------------------------------
    $Reports = Get-RsFolderContent -ReportServerUri $ConfigParam.SSRSURL -RsFolder $ConfigParam.FolderToDeploy)
#-----------------------------------------------------------------------------

#Publicamos los informes leidos en el directorio, si ya exite lo eliminamos

foreach ($File in $FilesToDeploy)
{
    
    $ExistReport = $Reports | Where Name -eq ($File.Name.Replace(".rdl","").Replace(".rsd",""))

    if ($ExistReport -ne $null)
    {
        Remove-RsCatalogItem  -ReportServerUri $ConfigParam.SSRSURL -RsFolder $ExistReport.Path
        Write-RsCatalogItem -ReportServerUri $ConfigParam.SSRSURL -Destination ($ConfigParam.FolderToDeploy) -OverWrite -Path ($ConfigParam.FolderFromDeploy + $File.Name)
        
         Write-Host  ("    Se ha recreado el informe: " + ($ConfigParam.FolderFromDeploy + $File.Name) + " en la ruta del server: "+ ($ConfigParam.FolderToDeploy +"/" + $File.Name.Replace(".rdl","").Replace(".rsd","")) )
    }
    else
    {
        Write-RsCatalogItem -ReportServerUri $ConfigParam.SSRSURL -Destination ($ConfigParam.FolderToDeploy) -OverWrite -Path ($ConfigParam.FolderFromDeploy + $File.Name)
        Write-Host  ("    Se ha creado el informe: " + ($ConfigParam.FolderFromDeploy + $File.Name) )
    }
}


#Para cada informe establecemos los datasources correspondientes
#-----------------------------------------------------------------------------
    $Reports = Get-RsFolderContent -ReportServerUri $ConfigParam.SSRSURL -RsFolder ($ConfigParam.FolderToDeploy) 

    foreach ($Report in $Reports )
    {
        if ($Report.TypeName -eq "Report") 
        {
            Try{Set-RsDataSourceReference -Path $Report.Path -DataSourceName Comercial   -DataSourcePath "/Origenes de Dato/DW_Comercial"}
            Catch
            {
                if( $_.Exception.hresult -ne -2146233087)
                {
                    $ErrorMessage = $_.Exception.Message
                    Write-Host  ($ErrorMessage)
                    break
                }
            }
        }

        if ($Report.TypeName -eq "Report") 
        {
            Try{Set-RsDataSourceReference -Path $Report.Path -DataSourceName CubeComercial   -DataSourcePath "/Origenes de Datos/DW_Comercial_Cube"}
            Catch
            {
                if( $_.Exception.hresult -ne -2146233087)
                {
                    $ErrorMessage = $_.Exception.Message
                    Write-Host  ($ErrorMessage)
                    break
                }           
            }
        }
    }
    Write-Host  ("Se ha Establecido los datasources correctamente")

Espero que este script os sirva como punto de partida para realizar de forma automática vuestros despliegues.

Reporting Services mediante la ejecución de scripts de PowerShell.

Un Saludo !

0 Shares:
2 comments
Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

You May Also Like
Leer más

Introducción a Timeline Storyteller

Introducción a Timeline Storyteller. Cuando tratamos de transmitir información ya sea en una charla, reunión o ya en ámbitos de la vida personal, el modo en el que transmitimos la información es esencial para que los oyentes muestren interés y entiendan la finalidad de lo que estamos contando.