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”.
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”.
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.
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.
En el siguiente menú vamos a Advanced…
Seguido de Add Web Reference…
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”.
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.
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…
1 comment
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!