En ocasiones podemos querer ejecutar un informe de reporting tras una carga de SSIS y dejarlo en una carpeta compartida o quizá enviarlo por correo sin crear una suscripción de reporting. En este post vamos a proponer una posible solución haciendo uso de SSIS y del Report Server Web Service.

Lo primero que necesitamos es desplegar nuestro informe en el servidor de reporting. En nuestro caso hemos creado un sencillo informe que se conecta a la base de datos “AdventureWorks2014” y que únicamente recibe un parámetro “Country”.

Ejecutar un informe de reporting desde SSIS
Informe desplegado

A continuación, necesitamos crear el paquete SSIS que generará el informe y lo almacenará en la ruta que decidamos. Para realizar lo que queremos nuestro paquete necesitará un “Script Task”.

Ejecutar un informe de reporting desde SSIS
Script Task

Sobre este paquete definiremos una serie de variables que necesitaremos utilizar en nuestra tarea para generar el informe:

Destination: es la ruta donde queremos que nuestro paquete deje el informe generado.

ReportParameter: es el parámetro que como comentamos arriba necesita nuestro informe, el parámetro “Country”.

ReportPath: es la ruta en nuestro servidor de informes donde se encuentra desplegado nuestro informe.

Ejecutar un informe de reporting desde SSIS
Variables

En el menú general de nuestra nueva tarea “Genera Report” añadiremos las variables que acabamos de crear como “ReadOnlyVariables” y a continuación iremos a editar script.

Lo primero que tendremos que hacer será añadir la referencia al servicio web de reporting para poder utilizarlo posteriormente en nuestro código, para ello hacemos botón derecho sobre References seguido de Add Service Reference.

Ejecutar un informe de reporting desde SSIS
Añadimos la referencia al Web Service

En el siguiente menú vamos a Advanced…

Ejecutar un informe de reporting desde SSIS
Menú 1

Seguido de Add Web Reference…

Ejecutar un informe de reporting desde SSIS
Menú 2

Finalmente en este menú añadiremos la URL del endpoint que permite la ejecución de nuestro informe. En esta URL están expuestas las clases y métodos que incluye el servicio web del servidor de informes. El nombre del endpoint es “ReportExecution2005”, y es común tanto para el modo nativo como para el modo integrado de Sharepoint aunque las URL variarán ligeramente. En nuestro ejemplo el servidor está configurado en modo nativo.

También tenemos que añadir un nombre para nuestro servicio web, en nuestro caso “ReportServerService”.

Ejecutar un informe de reporting desde SSIS
Referencia al Web Service

Ahora que ya hemos añadido nuestra referencia al servicio Web de reporting, ya podemos usarlo para escribir nuestro código y así crear nuestro informe en la ruta que hayamos decidido.

Añadimos el siguiente código a la sección Main de nuestro “Genera Report”…

public void Main()
{
            try
            {
                //Create as many params as the report needs
                var param = new ParameterValue[1];
                param[0] = new ParameterValue();
                param[0].Name = "Country";
                param[0].Value = Dts.Variables["User::ReportParameter"].Value.ToString();

                //Prepare report to execute
                var executionService = new ReportExecutionService();
                executionService.Credentials = System.Net.CredentialCache.DefaultCredentials;

                var reportPath = Dts.Variables["User::ReportPath"].Value.ToString();

                executionService.LoadReport(reportPath, null);
                executionService.SetExecutionParameters(param, "es-es");

                //Rendering arguments
                var format = "EXCEL"; 
                string encoding;
                string mimeType;
                string extension;
                Warning[] warnings = null;
                string[] streamIDs = null;
                byte[] result = executionService.Render(format, null, out extension, out mimeType, out encoding, out warnings, out streamIDs);

                //Create File
                var createdReport = File.Create(Dts.Variables["User::Destination"].Value.ToString(), result.Length);
                createdReport.Write(result, 0, result.Length);
                createdReport.Flush();
                createdReport.Close();

                Dts.TaskResult = (int)ScriptResults.Success;
            }
            catch (Exception ex)
            {
                Dts.TaskResult = (int)ScriptResults.Failure;
            }
}

Por último ya podemos ejecutar nuestro paquete y ver que el informe se genera correctamente en la ruta deseada.

Ejecutar un informe de reporting desde SSIS
Resultado final

En conclusión como comentamos anteriormente esta solución nos permite por ejemplo depositar informes en una ruta compartida, o quizá por medio de otras tareas en nuestro paquete SSIS enviar los informes generados por correo electrónico…

0 Shares:
1 comment
  1. Hola! Estoy probando implementar tu solución pero estoy teniendo problemas con las credenciales.
    Cómo podría setear las credenciales?
    Al debuggear veo que las defaultCredential y defaultCredentialNetwork están vacías, pero no logro setearles.
    Gracias!

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

Super SSIS, tu nuevo superhéroe

¿Tus procesos ETL con SSIS rinder a niveles humanos? ¿Necesitas más velocidad, gestionar más datos, mejor performance? ¿No tienes tiempo de esperar al último hijo de Krypton para que ejecute tus DataFlow? En esta sesión veremos técnicas de optimización en entornos modernos (¡estamos en 2017!) para que lleves tus paquetes SSIS al siguiente nivel... ¡el nivel de los superhéroes!