jueves, 20 de febrero de 2014

Llamar Reporte SSRS desde SSIS

En ocasiones es necesario en una solución de BI, Generar los reportes dentro de un mismo flujo de #SSIS.
En este caso practico veremos como hacer para que desde un Flujo de #SSIS se puedan generar reportes en formato excel ó PDF. En la segunda parte de este post tambien veremos como distribuir estos reportes a #SharePoint 2013 o vía Email.

Para que este componente que vamos a desarrollar sea re utilizable  lo que tenemos que hacer es empaquetar la lógica en un DLL.

1) Creamos un proyecto de tipo Biblioteca de clases.


2) Agregamos la referencia "Microsoft.ReportViewer.WebForms"


3)Agregamos una clase con el nombre Get con el siguiente código.

using Microsoft.Reporting.WebForms;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
namespace Helper.SSRS
{
    public static class Get
    {
        private static void Generate(Dictionary<string,string> parameters,string pathOutPut,string typeFile)
        {
            try
            {
                string url = ConfigurationManager.AppSettings.Get("Url ReportServer");
                string path = ConfigurationManager.AppSettings.Get("Path Report");
                string extention=string.Empty;
                ReportViewer reportViewer = new ReportViewer();
                reportViewer.ServerReport.ReportServerUrl = new Uri(@url);
                reportViewer.ServerReport.ReportPath = path;
                if (parameters!=null || parameters.Count>0)
                {
                    reportViewer.ServerReport.SetParameters(GetParameters(parameters));
                }
                switch (typeFile.ToUpper())
           {
           case "PDF":
                        extention="pdf";
                        break;
                    case "EXCELOPENXML":
                        extention="xlsx";
                        break;
                    case "MHTML":
                        extention="mhtml";
                        break;
                    case "WORDOPENXML":
                        extention = "docx";
                        break;
                        default:
                            break;
           
                }
                string mimeType;
                string encoding;
                string extension;
                string[] streams;
                Warning[] warnings;
                
                byte[] pdfBytes=reportViewer.ServerReport.Render(typeFile.ToUpper(), string.Empty, out mimeType,out encoding, out extension, out streams, out warnings);
                // save the file
                using (FileStream fs = new FileStream(string.Format("{0}.{1}", pathOutPut, extention), FileMode.Create))
                {
                    fs.Write(pdfBytes, 0, pdfBytes.Length);
                    fs.Close();
                }
                
                
            }
            catch (Exception ex)
            {
                Logger.Write(TraceLevel.Error, "", ex);
            }
        }

        public static void Html(Dictionary<string, string> parameters, string pathOutPut)
        {
            Generate(parameters, pathOutPut, "MHTML");
        }
        public static void PDF(Dictionary<string, string> parameters, string pathOutPut)
        {
            Generate(parameters, pathOutPut, "PDF");
        }
        public static void Excel(Dictionary<string, string> parameters, string pathOutPut)
        {
            Generate(parameters, pathOutPut, "EXCELOPENXML");
        }
public static void Word(Dictionary<string, string> parameters, string pathOutPut)
        {
            Generate(parameters, pathOutPut, "WORDOPENXML");
        }
        private static List<ReportParameter> GetParameters(Dictionary<string,string> parameter)
        {
            List<ReportParameter> res=new List<ReportParameter>();
            foreach (var item in parameter)
            {
                res.Add(new ReportParameter(item.Key, item.Value));
            }
            return res;
        }
        
    }
}

Este código nos permite guardar un reporte en los formatos Excel, HTML, Word y PDF.
Como menciona vamos antes este condigo nos permite que configurar el servidor de reportes y el reporte.
También nos permite enviar parámetros si es que nuestros reportes tuvieran parámetros .Con esto podríamos utilizar esta funcionalidad en otros proyectos.
Registramos la ddl con el comando #gacutil.exe "esto se describe post anteriores".
 
4) tenemos que firmar el ensamblado.


Con esto tenemos la parte del el helper que nos ayudara a generar el Reporte.

Los siguiente que nos queda es consumir este componente desde el Flujos SSIS.
Tenemos que hacer los siguiente

1) En el flujo de integración #SSIS agregamos una Script Task

2) Damos click botón derecho en La caja de Scrip Task [Edit] despues en la ventana emergente damos click [Edit...]


Se abrirá un visual estudio donde podemos llamar a nuestro componente Helper.SSRS.

3) Agregamos la referencia del componente Helper.SSRS


4) Agregamos Archivo de configuración


5) Agregamos las siguientes entradas en el archivo de configuración.


6) Finalmente agregamos el siguiente condigo para hacer la llamada al componente.



Compilamos y cerramos con esto ya podemos generar el reporte en formato excel y guardarlo.
En este caso como mi reporte tiene un parámetro que se llama ID_PLAN se agrega en el diccionario de parámetros.
El helper esta diseñado para agregar n parámetros. o bien ninguno.
El segundo parámetro de el método es la ruta con el nombre que queremos que se guarde el reporte.

En la segunda parte de el post agregaramemos la funcionalidad de distribución.
Saludos

Aldo Flores Reyes
@alduar

"La nube no es el futuro es el presente" Aldo Flores Reyes