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”.

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».

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.

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.

Añadimos la referencia al Web Service

En el siguiente menú vamos a Advanced…

Menú 1

Seguido de Add Web Reference…

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».

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.

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…

Javier López

Javier López Cano es miembro de SolidQ en el área de inteligencia de negocio, participa en proyectos de BI.

Latest posts by Javier López (see all)