martes, 17 de mayo de 2016

Extraer Datos de un XML

En esta entrada veremos como podemos extraer datos de un archivo XML, cosa que es muy sencilla en realidad.

Para eso necesitaremos los siguientes elementos:

"FileUpload"
"Button"
"GridView"
"Panel"
"Label"

El "FileUpload" nos servirá para leer los archivos XML, el "Button" ejecutara el proceso para leer los datos, en el "Gridview" vamos a mostrar los datos que recuperaremos de nuestro archivo y en el "Panel" meteremos el "Label" para mostrar algún tipo de error que nos mande el proceso.

Nuestra pantalla quedará así:

 
 

Dentro del código, en el Page_Load vamos a poner nuestro "Panel" como invisible, para que solo aparezca cuando mandemos un mensaje, en mi caso sea así  "Panel4.Visible = false;".

En el diseño le damos doble click al "Button" para que nos genere el evento "Click", vamos a generar 2 eventos, uno para borrar los archivos que estén en el directorio donde almacenaremos los XML(para esto vamos a crear una carpeta en nuestro proyecto que se llamará: ArchivosXML),  que vamos a leer y otro para hacer la lectura.

El evento para borrarlos será el siguiente:

      private void borrarArchivos()
    {
        try
        {
            Panel3.Visible = false;
            Panel3.Visible = false;
            string sourceDir = (Server.MapPath("~/ArchivosXML/"));

            string[] txtList = Directory.GetFiles(sourceDir, "*.xml");
            foreach (string f in txtList)
            {
                File.Delete(f);
            }
        }
        catch (Exception ex)
        {
            Panel4.Visible = true;
            Label1.Text = ex.Message.ToString();
        }
    }


Y el evento para hacer la lectura nos quedará de la siguiente forma:

     private void cargaArchivos()
    {
        if (FileUpload1.HasFile)
        {
            DateTime fechaVar = DateTime.Now;
            string foliovar = " ";
            string serievar = "";
            Decimal totalvar = 0;

            DataTable dt = new DataTable();
            dt.Columns.Add("fFecha");
            dt.Columns.Add("cFolio");
            dt.Columns.Add("cSerie");
            dt.Columns.Add("mTotal");
            DataRow dr;
            DataSet ds = new DataSet();

            ds.Tables.Add(dt);
            FileUpload1.SaveAs(Server.MapPath("~/ArchivosXML/") + FileUpload1.FileName);
            XmlTextReader reader = new XmlTextReader((Server.MapPath("~/ArchivosXML/")) + FileUpload1.FileName.ToString());
            XDocument docContactos = XDocument.Load((Server.MapPath("~/ArchivosXML/")) + FileUpload1.FileName.ToString());
            string Archivo = (Server.MapPath("~/ArchivosXML/")) + FileUpload1.FileName.ToString();

            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                    case XmlNodeType.Element:
                        try
                        {
                            XmlDocument DocumentXml = new XmlDocument();
                            DocumentXml.Load(Archivo);
                            XmlNodeList Documento = DocumentXml.GetElementsByTagName(reader.Name);

                            int i = 0;
                            foreach (XmlElement nodoDocumento in Documento)
                            {
                                if (reader.Name.Contains("Comprobante"))
                                {
                                    if (Documento[i].Attributes["fecha"] != null)
                                    {
                                        fechaVar = Convert.ToDateTime(Documento[i].Attributes["fecha"].Value.Substring(0, 10));


                                        if (Documento[i].Attributes["total"] != null)
                                        {
                                            totalvar = Convert.ToDecimal(Documento[i].Attributes["total"].Value);
                                        }
                                    }
                                }
                                if (reader.Name.Contains("Comprobante"))
                                {
                                    if (Documento[i].Attributes["folio"] != null)
                                    {
                                        foliovar = Documento[i].Attributes["folio"].Value;
                                    }
                                    if (Documento[i].Attributes["serie"] != null)
                                    {
                                        serievar = Documento[i].Attributes["serie"].Value;
                                    }
                                    i++;
                                }

                            }
                        }
                        catch (Exception ex)
                        {
                            Panel4.Visible = true;
                            Label1.Text = ex.Message.ToString();
                        }
                        break;
                }
            }
            dr = dt.NewRow();
            dr["cFolio"] = foliovar;
            dr["cSerie"] = serievar;
            dr["mTotal"] = totalvar.ToString();
            dr["fFecha"] = fechaVar.ToShortDateString();
            dt.Rows.Add(dr);
            GridView1.DataSource = ds;
            GridView1.DataBind();
            reader.Close();
            //validaEmpresa();
            if (System.IO.File.Exists(Archivo))
            {
                try
                {
                    System.IO.File.Delete(Archivo);
                }
                catch (System.IO.IOException e)
                {
                    Panel4.Visible = true;
                    Label1.Text = e.Message.ToString();
                }

            }
        }
        else
        {
            Panel4.Visible = true;
            Label1.Text = "Seleccione un archivo XML para llevar a cabo el proceso";
        }
    }


El evento que se genero al darle doble click a nuestro "Button", quedará así:
 
     protected void Button1_Click(object sender, EventArgs e)
    {
        borrarArchivos();
        cargaArchivos();
    }


Ahora si vamos a ejecutar nuestra aplicación web para ver como se ve y, lo mas importante, ver que funcione realmente.

Así se ve:

 
 
Le damos un click en Examinar para que nos abra le cuadro para seleccionar los archivos:


 
 
Ya tenemos seleccionado nuestro XML:
 
 
 
Y ahora le daremos click al botón de cargar y veremos el resultado:
 
 
En el "GridView" se muestran los datos que leímos del XML.
 
Les dejo el link del ejemplo para que puedan descargarlo.
 
 
Como siempre,  espero y les sirva de algo mi experiencia, les dejo a su disposición mi correo para cualquier duda, aclaración o sugerencia, ricegamo@hotmail.com
Saludos

 

miércoles, 9 de marzo de 2016

Ordenar GridView en modo de ejecución

Normalmente al tener un GridView en nuestra aplicación, el ordenamiento lo traemos desde el código:

Select * From CargaExcel Order by iDdato Desc o Asc

Pero si un usuario final quisiera ordenarlo dándole un click al encabezado del GridView??. Eso fue un requerimiento que me pidieron para una consulta. Lo primero que pensé fue poner un DropDownList y que la lista tuviera un Ascendente y un Descendente, y con un botón mandarlo a llamar, pero eso implicaría estar haciendo llamados innecesarios a la Base de Datos.

Entonces pensé, bueno, ya tengo los datos en la pagina, ya lo mandé a llamar, ¿por qué no meto esos datos en un DataSet y con eso los ordeno?, y así fue como le hice, no se si sea la mejor solución, pero a mi me funcionó.

Vamos al ejemplo paso a paso.

En un WebForm agregamos un objeto de tipo Button, para desde allí mandar a llamar los datos de la Base de Datos, un GridView, para ahí mostrar los datos y un Label, para colocar cualquier mensaje que pudiera arrojarnos nuestra aplicación.

Entonces quedaría algo así:

 
 
Ahora vamos a darle un poco de diseño a nuestro GridView. Voy a tomar los datos de una tabla que se llama "CargaExcel".
 
 
 
Ahora vamos a "retocar" nuestro GridView, lo seleccionamos y le damos un click a la flechita que nos aparece del lado derecho y le damos click a "Editar columnas ...".
 
 
 
Listo ahora nos abrirá una ventanita como la siguiente.
 
 
 
Colocándonos en "BoundField", le damos en el botón que dice, "Agregar"
 



 
 
 
Y lo personalizamos, en HeaderText le pondré "Identificador", en la parte donde dice Datos en "DataField" le pondré el nombre de mi campo en la Base de Datos, en este caso "iDdato", podremos agregar los campos que sean necesarios, para este ejercicio solo agregué 2, "iDdato" y "DatoCargado", desmarcamos "Generar campos automáticamente" y nos quedará así nuestro Gridview.
 
 
 
Listo, ahora nos toca mostrar los datos en nuestro GridView, el código que utilizo es el siguiente.
 

protected void Button1_Click(object sender, EventArgs e)

{

try

        {

            List<CargaExcel> lista = AdminCargaExcel.RecuperaTodo();

            GridView2.DataSource = lista;

            GridView2.DataBind();

        }

        catch (Exception ex)

        {

            Label10.Visible = true;

            Label10.Text = ex.Message.ToString();

        }

}

 
El código va dentro del evento Click de nuestro Botón, y así se ve en la web.
 
 
 
 
Ahora viene la parte que nos interesa, el ordenamiento en ejecución., volvemos a seleccionar nuestro GridView y le damos click en la flechita del lado derecho y click en "Editar columnas ...", nos colocamos donde dice "SortExpression" en el área de "Comportamiento" y ponemos ahí el nombre del campo en cuestión, esto va a ser por cada Campo seleccionado o por los que necesitamos ordenar.
 
 
 
Volvemos a seleccionar nuestro GridView y nos vamos a las propiedades y en la categoría de comportamiento ubicamos "AllowSorting" y cambiamos "False" por "True"
 
 
 
Nuestro GridView lucirá así
 
 
 
 
Ahora vamos al código!!!. Nuevamente teniendo nuestro GridView seleccionado nos vamos a propiedades y nos vamos a la pestaña de eventos y le vamos a dar doble click a "Sorting".
 
 
Ya nos colocó el evento para nosotros poder poner la instrucción para reordenar.
 
 
 
 
El código que utilizo es el siguiente.
 

protected void GridView2_Sorting(object sender, GridViewSortEventArgs e)

    {

 

        DataTable dt = new DataTable();

        dt.Columns.Add("iDdato");

        dt.Columns.Add("DatoCargado");

        DataSet ds = new DataSet();

 

        ds.Tables.Add(dt);

        for (int i = 0; i < GridView2.Rows.Count; i++)

        {

            DataRow dr = dt.NewRow();

            dr["iDdato"] = HttpUtility.HtmlDecode(GridView2.Rows[i].Cells[0].Text);

            dr["DatoCargado"] = HttpUtility.HtmlDecode(GridView2.Rows[i].Cells[1].Text);

 

            dt.Rows.Add(dr);

        }

 

        if (dt != null)

        {

            DataView dataView = new DataView(dt);

            dataView.Sort = e.SortExpression + " " + DireccionOrden(e.SortExpression);

            dt.DefaultView.Sort = e.SortExpression;

 

            DataSet ds1 = new DataSet();

 

            GridView2.DataSource = dataView;

            GridView2.DataBind();

        }

    }

 
Ahora pondremos el código que define si es Ascendente o Descendente, para eso utilizaremos "ViewState" para guardar los valores de la pagina.
 

private string DireccionOrden(string column)

    {

        string sortDirection = "ASC";

        string sortExpression = ViewState["SortExpression"] as string;

        if (sortExpression != null)

        {

            if (sortExpression == column)

            {

                string lastDirection = ViewState["SortDirection"] as string;

                if ((lastDirection != null) && (lastDirection == "ASC"))

                {

                    sortDirection = "DESC";

                }

            }

        }

        // Save new values in ViewState.

        ViewState["SortDirection"] = sortDirection;

        ViewState["SortExpression"] = column;

        return sortDirection;

    }

 
Nuestra WebForm luce así
 
 
 
Nótese como los encabezados están resaltados como links, ahora veremos que pasa si le damos click a alguno de ellos
 
 

 
 
Ya ordenó por "Identificador", le daremos otro click a la columna de "Identificador" a ver que sucede
 
 

 
 
Listo, ya quedó nuestra página y podemos ordenar los datos del GridView en modo de ejecución.
 
 
Como siempre,  espero y les sirva de algo mi experiencia, les dejo a su disposición mi correo para cualquier duda, aclaración o sugerencia, ricegamo@hotmail.com

Saludos
 


 
 
 
 



 


jueves, 18 de febrero de 2016

Carga de datos mediante un archivo Excel

En algunas ocasiones es necesario hacer una carga de datos desde un archivo Excel, extensión "XLS", para hacer más ágil el trabajo de nuestros usuarios, en esta entrada vamos a ver como hacerla y ver que tipo de inconvenientes se me presentaron al hacer la Webform.

Lo primero será arrastrar un elemento de tipo FileUpload, uno de tipo Button y otro de tipo Label para ahí colocar cualquier mensaje que pueda presentarnos nuestra Webform.



Una vez teniendo estos 3 elementos, vamos a teclear código, para eso le daremos doble click a nuestro elemento Button para ir al evento del mismo. Cabe mencionar que en nuestra solución manejamos varios proyectos, uno donde tenemos nuestras entidades, otro donde tenemos el acceso a datos, otro donde vienen las reglas de negocio y el sitio web, que es nuestra interfaz de usuario.

Dentro del evento Click de nuestro botón vamos a poner el siguiente código:

try
{
  if (FileUpload1.HasFile)
  {
     FileInfo info = new FileInfo(FileUpload1.PostedFile.FileName); // System.IO
     if (info.Extension.ToString() != ".xls")
         {
        Label10.Text = "El archivo Seleccionado no es correcto";
          }
      else     
      {
       ///// CargaExcel es la tabla donde se almacenaran los datos que se van a cargar en nuestra base de datos
         AdminCargaExcel Administra = new AdminCargaExcel();
         CargaExcel Datos = new CargaExcel();
        
         FileUpload1.SaveAs(@"C:\temp\" + FileUpload1.FileName);

        string CadenaConexion = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                                "Data Source=C:\\temp\\"+FileUpload1.FileName+
                                ";Extended Properties=\"Excel 8.0;HDR=NO\"";
        OleDbConnection con = new OleDbConnection(CadenaConexion);
        string strSQL = "SELECT * FROM [Hoja1$]";
        OleDbDataAdapter da = new OleDbDataAdapter(strSQL, con);
        DataSet ds = new DataSet();
        da.Fill(ds);
      
        try
        {     
         if (ds.Tables.Count > 0)
             foreach (DataRow row in ds.Tables[0].Rows)
             {
                 Datos.DatoCargado = Convert.ToString(row[0].ToString().ToUpper());
                 Administra.Guardar(Datos);
             }  
        }
        catch (Exception ex)
        {
            Label10.Text = ex.Message;
        }
      }
    }
   else
   {
        Label10.Text = "NO CARGO EL ARCHIVO";
   }
}
catch (Exception ex)
{
     Label10.Text = ex.Message;
}


Ese será el código que necesitaremos, con esto se hace la carga. Aquí esta el archivo Excel

 
 
Así luce mi Webform



Le doy click a examinar



Selecciono el archivo y le doy click al botón


Y listo, ya se hizo la carga en la base de datos



En modo desarrollo todo jalaba de maravilla, seleccionaba el archivo, hacia las validaciones y cargaba la información, ya era momento de ponerlo en producción, y ZAZ!!!


"El proveedor 'Microsoft.Jet.OLEDB.4.0' no está registrado en el equipo local."

Algo que no me esperaba y entré un poco en pánico, pensé que seria necesario instalar algo, busqué en algunos foros y leía que tenia que instalar "AccessDatabaseEngine", yo no quería instalar nada en nuestro servidor, eso no estaba en los planes, pero hubo una luz al final del túnel y aparecía ante mi la respuesta, todo estaba en el Administrador del IIS.

Dentro del Administrador del IIS, en "Conexiones", seleccionamos "Grupo de aplicaciones"

 


Seleccionamos el grupo de aplicaciones al cual pertenece nuestra aplicación, en mi caso es "DefaultAppPool", le damos un click derecho y nos vamos a "Configuración Avanzada..."

 Ahí nos mostrará la siguiente pantalla



Y lo único que hay que hacer es, en la parte de "(General)", ubicamos "Habilitar aplicaciones de 32 bits" y modificamos de "False" a "True"



LISTO!!!! con esto quedará resuelto este pequeño inconveniente!!!

Espero y les sirva de algo mi experiencia, les dejo a su disposición mi correo para cualquier duda, aclaración o sugerencia, ricegamo@hotmail.com

Saludos